CodeSampleX

Exemple

tenacity 9.1.4: Retry a flaky call with backoff and give up on the errors that will never succeed

Échantillon vérifié pour pypi tenacity 9.1.4: Retry a flaky call with backoff and give up on the errors that will never succeed. Le contrat s'est exécuté sur…

sha256:0ecf1213d98587dc35571381763d2382bcdd44d9136b07b21b8b755dbca8ceb9

Ce réseau offre une seule chose : un échantillon qui compile. Il l'a exécuté dans un bac à sable et conservé le reçu signé. Il ne note rien et ne garantit rien : si le même code compile chez vous, il ne l'a pas mesuré. Combien de clés de signature distinctes ont déposé un reçu de contrat réussi. Une seule, c'est l'auteur ; plus d'une signifie que quelqu'un d'autre l'a compilé aussi. Une clé est auto-générée sans identité enregistrée derrière, donc on compte des clés, pas des personnes. MIT-0

Preuves d'exécution

L'environnement déclaré et les exécutions signées sont séparés, pour que vous voyiez exactement ce que cet échantillon a exécuté et où.

Base de preuve
Contrat signé réussi
Reçus de vérification
2
Clés de signature qui l’ont compilé
2
Environnement déclaré python 3.12 linux x64 python 3.12 python pip

Environnements des exécutions de vérification

Environnement Contrat Étapes Exécution
python 3.12 · linux alpine/x64 · docker ed25519:a2ec939a4c60e243 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · python@1
2026-08-13
python 3.12 · linux alpine/x64 · docker ed25519:d91480838ac982c9 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · python@1
2026-08-17

Cas

HOW
Objectif
Retry a flaky call with backoff and give up on the errors that will never succeed
Paquets
Symboles
  • retry
  • stop_after_attempt
  • wait_fixed
  • retry_if_exception_type
Environnement
python 3.12
Créé
2026-08-13T18:43:56Z

Contrat

  1. retry a function that fails twice then succeeds
  2. assert it was called exactly three times
  3. assert an exception type outside the retry filter is raised immediately
  4. assert exhausting the attempts raises RetryError carrying the last failure

Fichiers

  • csx.json
  • requirements.txt
  • src/__init__.py
  • src/retry.py
  • test/contract.py

Télécharger l’artefact source (tar.gz)

Code source

csx.json
{"case":{"caseId":"case:sha256:e95b2d65f45ae3869f087aecfeddb905091f9762f83d3fa54d854f75fc95257a","constraints":{"runtime":"python"},"contract":["retry a function that fails twice then succeeds","assert it was called exactly three times","assert an exception type outside the retry filter is raised immediately","assert exhausting the attempts raises RetryError carrying the last failure"],"goal":"Retry a flaky call with backoff and give up on the errors that will never succeed","kind":"HOW","packages":["pkg:pypi/tenacity@9.1.4"],"schemaVersion":1,"symbols":["retry","stop_after_attempt","wait_fixed","retry_if_exception_type"]},"contractCommand":["python","test/contract.py"],"environment":{"arch":"x64","ecosystem":"pypi","executionContext":"python","language":"python","os":"linux","packageManager":"pip","runtime":"python","runtimeVersion":"3.12","schemaVersion":1},"license":"MIT-0","packages":["pkg:pypi/tenacity@9.1.4"],"schemaVersion":1,"symbols":["retry","stop_after_attempt","wait_fixed","retry_if_exception_type"],"verifierAdapter":"python@1"}
requirements.txt
tenacity==9.1.4
src/__init__.py
src/retry.py
"""Bounded retries with tenacity."""

from tenacity import (
    retry,
    retry_if_exception_type,
    stop_after_attempt,
    wait_fixed,
)


class Transient(Exception):
    """Worth retrying: a timeout, a 503, a dropped connection."""


class Permanent(Exception):
    """Never worth retrying: bad credentials, a 400, a missing table."""


def make_flaky(fail_times, error=Transient):
    calls = {"n": 0}

    @retry(
        # Without retry=, tenacity retries EVERY exception, which turns a
        # permanent failure into the same failure N times and N times slower.
        retry=retry_if_exception_type(Transient),
        stop=stop_after_attempt(3),
        wait=wait_fixed(0.01),
    )
    def call():
        calls["n"] += 1
        if calls["n"] <= fail_times:
            raise error("attempt %d" % calls["n"])
        return "ok"

    return call, calls
test/contract.py
import os
import sys

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from tenacity import RetryError

from src.retry import Permanent, Transient, make_flaky

# Fails twice, succeeds on the third attempt.
call, calls = make_flaky(2)
assert call() == "ok"
assert calls["n"] == 3, calls

# A permanent error is not retried: raised on the first attempt.
call, calls = make_flaky(5, error=Permanent)
try:
    call()
except Permanent:
    pass
else:
    raise AssertionError("a non-retryable error must propagate immediately")
assert calls["n"] == 1, calls

# Exhausting the attempts raises RetryError wrapping the last failure.
call, calls = make_flaky(99)
try:
    call()
except RetryError as exc:
    assert calls["n"] == 3, calls
    assert isinstance(exc.last_attempt.exception(), Transient)
else:
    raise AssertionError("exhausted retries must raise RetryError")

print("CONTRACT PASS: tenacity retried only what it was told to, three times")

Seeder d'origine

anonymous