diff --git a/fire/parser.py b/fire/parser.py index a335cc2c..93563d22 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 a404eea2..d2217b94 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('"'), '"')