Skip to content

Bug: data masking prepare_data leaves dataclasses and Pydantic models unconverted #8672

Open

Description

@LemonCondor

Expected Behaviour

DataMasking.erase (and the other operations that go through prepare_data) should convert every dataclass and Pydantic model in the input to plain data, however many there are and whether or not the same instance appears twice.

Current Behaviour

prepare_data records the id() of every object it has visited in _visited to detect circular references, and never removes them. That includes the temporary dicts built by dataclasses.asdict() and model_dump(). Once one of those is freed, CPython reuses its id for a later object, which is then taken for a circular reference and returned unconverted. An instance referenced twice is skipped the same way. erase then fails with TypeError: Object of type X is not JSON serializable.

Code snippet

from dataclasses import dataclass
from pydantic import BaseModel
from aws_lambda_powertools.utilities.data_masking import DataMasking
from aws_lambda_powertools.utilities.data_masking.base import prepare_data

class Card(BaseModel):
    number: str

@dataclass
class Item:
    card: Card

print(prepare_data({"items": [Item(Card(number=str(i))) for i in range(5)]}))
# some items still contain Card(...) objects instead of dicts

@dataclass
class Person:
    age: int

p = Person(age=30)
DataMasking().erase({"items": [p, p]}, fields=["items[*].age"])
# TypeError: Object of type Person is not JSON serializable

Possible Solution

Keep in _visited only the objects on the current conversion path (add before recursing, remove in a finally). Circular references are still caught, and the existing circular-reference test still passes. I have this fix with regression tests in tests/functional/data_masking/_pydantic/test_data_masking_with_pydantic.py (fail on develop, pass with the change) and can open a PR once this is triaged.

Steps to Reproduce

Run the snippet above on develop (5785377).

Powertools for AWS Lambda (Python) version

latest (3.37.0, develop)

AWS Lambda function runtime

3.13

Packaging format used

PyPi

Debugging logs

N/A

Activity

  1. therealemmanueloppong commented on Nov 1, 2026

    @therealemmanueloppong

    Hi, thank you for the clear report and for maintaining Powertools.

    I would like to work on a fix for this. Per CONTRIBUTING.md, could a maintainer triage the issue first? I will wait for that before opening a PR.

    For transparency: I am using an AI assistant (Claude) to help me investigate and draft the change. I will run the tests myself, read the output, and say so in the PR, as the contribution guide asks.

    My plan, if it matches what you would want: keep prepare_data behaviour the same, track only the objects that are currently being walked (so circular references are still detected) instead of every id ever seen, and add a regression test that fails on develop. Please tell me if you would prefer a different approach.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions