From 145710c7171fcec2fa7f6ad258445e27c2823382 Mon Sep 17 00:00:00 2001 From: santhreal <64453045+santhreal@users.noreply.github.com> Date: Fri, 17 Jul 2026 23:01:36 -0700 Subject: [PATCH] fix: accept dict attribute mappings in attr() Passing a dict to attr() hit mapping.get on an unhashable key before the dict-set branch, unlike css() and kwargs. Remap only string names and dict keys. --- pyquery/pyquery.py | 5 +++-- tests/test_pyquery.py | 9 +++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/pyquery/pyquery.py b/pyquery/pyquery.py index 53aeaac..b158e47 100644 --- a/pyquery/pyquery.py +++ b/pyquery/pyquery.py @@ -768,7 +768,8 @@ def attr(self, *args, **kwargs): length = len(args) if length == 1: attr = args[0] - attr = mapping.get(attr, attr) + if not isinstance(attr, dict): + attr = mapping.get(attr, attr) elif length == 2: attr, value = args attr = mapping.get(attr, attr) @@ -784,7 +785,7 @@ def attr(self, *args, **kwargs): elif isinstance(attr, dict): for tag in self: for key, value in attr.items(): - tag.set(key, value) + tag.set(mapping.get(key, key), value) elif value is no_default: return self[0].get(attr) elif value is None: diff --git a/tests/test_pyquery.py b/tests/test_pyquery.py index b8ee3c8..6d0b7c0 100644 --- a/tests/test_pyquery.py +++ b/tests/test_pyquery.py @@ -489,6 +489,15 @@ def test_attr_empty_string(self): self.assertEqual(d.outer_html(), '
') self.assertEqual(d.outer_html(method="xml"), '
') + def test_attr_dict_mapping(self): + d = pq('
') + d.attr({'id': 'x', 'class_': 'y', 'data-a': '1'}) + self.assertEqual(d.attr('id'), 'x') + self.assertEqual(d.attr('class'), 'y') + self.assertEqual(d.attr('data-a'), '1') + self.assertEqual(d.attr(id='z', class_='w').attr('id'), 'z') + self.assertEqual(d.attr('class'), 'w') + def test_remove(self): d = pq(self.html) d('img').remove()