From 946be3a03824b98c74c478f2eb1e1b7e0881584f Mon Sep 17 00:00:00 2001 From: Ali Zulfiqar <169186637+codewithfourtix@users.noreply.github.com> Date: Fri, 2 Oct 2026 09:23:36 +0500 Subject: [PATCH] Preserve template arguments that contain unhashable literals --- fire/parser.py | 2 +- fire/parser_test.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/fire/parser.py b/fire/parser.py index a335cc2c0..93563d22e 100644 --- a/fire/parser.py +++ b/fire/parser.py @@ -71,7 +71,7 @@ def DefaultParseValue(value): # Note: _LiteralEval will treat '#' as the start of a comment. try: return _LiteralEval(value) - except (SyntaxError, ValueError): + except (SyntaxError, ValueError, TypeError): # If _LiteralEval can't parse the value, treat it as a string. return value diff --git a/fire/parser_test.py b/fire/parser_test.py index a404eea28..d2217b943 100644 --- a/fire/parser_test.py +++ b/fire/parser_test.py @@ -128,6 +128,15 @@ def testDefaultParseValueBadLiteral(self): parser.DefaultParseValue('[(A, 2, "3"), 5'), '[(A, 2, "3"), 5') self.assertEqual(parser.DefaultParseValue('x=10'), 'x=10') + def testDefaultParseValueUnhashableLiteral(self): + for value in ('{{name}}', '{[1]}', '{[1]: 2}', '{{a: 1}: 2}'): + with self.subTest(value=value): + self.assertEqual(parser.DefaultParseValue(value), value) + + def testDefaultParseValueHashableContainers(self): + self.assertEqual(parser.DefaultParseValue('{one, two}'), {'one', 'two'}) + self.assertEqual(parser.DefaultParseValue('{(1, 2): [3]}'), {(1, 2): [3]}) + def testDefaultParseValueSyntaxError(self): # If it can't be parsed, we treat it as a string. self.assertEqual(parser.DefaultParseValue('"'), '"')