[utils] devalue: Fix calling reviver on cached value (#15568)

Authored by: Grub4K
This commit is contained in:
Simon Sawicki
2026-01-16 15:53:32 +01:00
committed by GitHub
parent 27afb31edc
commit ede54330fb
2 changed files with 7 additions and 3 deletions

View File

@@ -227,9 +227,13 @@ class TestDevalue(unittest.TestCase):
{'a': 'b'}, 'revivers (indirect)') {'a': 'b'}, 'revivers (indirect)')
self.assertEqual( self.assertEqual(
devalue.parse([['parse', 1], '{"a":0}'], revivers={'parse': lambda x: json.loads(x)}), devalue.parse([['parse', 1], '{"a":0}'], revivers={'parse': json.loads}),
{'a': 0}, 'revivers (parse)') {'a': 0}, 'revivers (parse)')
self.assertEqual(
devalue.parse([{'a': 1, 'b': 3}, ['EmptyRef', 2], 'false', ['EmptyRef', 2]], revivers={'EmptyRef': json.loads}),
{'a': False, 'b': False}, msg='revivers (duplicate EmptyRef)')
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@@ -62,10 +62,10 @@ def parse_iter(parsed: typing.Any, /, *, revivers: dict[str, collections.abc.Cal
if isinstance(source, tuple): if isinstance(source, tuple):
name, source, reviver = source name, source, reviver = source
try: try:
resolved[source] = target[index] = reviver(target[index]) target[index] = reviver(target[index])
except Exception as error: except Exception as error:
yield TypeError(f'failed to parse {source} as {name!r}: {error}') yield TypeError(f'failed to parse {source} as {name!r}: {error}')
resolved[source] = target[index] = None target[index] = None
continue continue
if source in resolved: if source in resolved: