Files
RustPython/extra_tests/snippets/stdlib_operator.py
T
youknowdot 7c9a0e32b3 Traverse references held by operator callables (#9044)
Extract attrgetter, itemgetter and methodcaller GC traversal from #8954. Add four bounded reference-cycle cases to the existing operator snippet, including a non-dotted str subclass retained by attrgetter.

Assisted-by: OpenAI Codex:model identifier unavailable
2026-10-10 19:34:41 +09:00

34 lines
872 B
Python

import _operator
assert _operator._compare_digest("abcdef", "abcdef")
assert not _operator._compare_digest("abcdef", "abc")
assert not _operator._compare_digest("abc", "abcdef")
def check_operator_reference_cycles():
import gc
import weakref
class Holder:
pass
class Name(str):
pass
for make, make_payload in (
(_operator.itemgetter, Holder),
(lambda value: _operator.methodcaller("method", value), Holder),
(lambda value: _operator.methodcaller("method", value=value), Holder),
(_operator.attrgetter, lambda: Name("attribute")),
):
payload = make_payload()
wrapper = make(payload)
payload.wrapper = wrapper
reference = weakref.ref(payload)
del wrapper, payload
gc.collect()
assert reference() is None
check_operator_reference_cycles()