Skip to content

pytest-fixture-finalizer-callback (PT021)#

Derived from the flake8-pytest-style linter.

What it does#

Checks for unnecessary request.addfinalizer usages in pytest fixtures.

Why is this bad?#

pytest offers two ways to perform cleanup in fixture code. The first is sequential (via the yield statement), the second callback-based (via request.addfinalizer).

The sequential approach is more readable and should be preferred, unless the fixture uses the "factory as fixture" pattern.

Example#

import pytest


@pytest.fixture()
def my_fixture(request):
    resource = acquire_resource()
    request.addfinalizer(resource.release)
    return resource

Use instead:

import pytest


@pytest.fixture()
def my_fixture():
    resource = acquire_resource()
    yield resource
    resource.release()


# "factory-as-fixture" pattern
@pytest.fixture()
def my_factory(request):
    def create_resource(arg):
        resource = acquire_resource(arg)
        request.addfinalizer(resource.release)
        return resource

    return create_resource

References#