diff --git a/ChangeLog b/ChangeLog index b49d64746..47bb4d19b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,10 @@ What's New in astroid 4.0.0? ============================ Release date: TBA +* Fix crash when inferring namedtuple with invalid field name looking like f-string formatting. + + Closes #2519 + * Fix false positive no-member in except * handler. Closes pylint-dev/pylint#9056 diff --git a/astroid/exceptions.py b/astroid/exceptions.py index 126acb954..e523b70c3 100644 --- a/astroid/exceptions.py +++ b/astroid/exceptions.py @@ -64,7 +64,10 @@ def __init__(self, message: str = "", **kws: Any) -> None: setattr(self, key, value) def __str__(self) -> str: - return self.message.format(**vars(self)) + try: + return self.message.format(**vars(self)) + except ValueError: + return self.message # Return raw message if formatting fails class AstroidBuildingError(AstroidError): diff --git a/tests/test_regrtest.py b/tests/test_regrtest.py index 9fcc378dc..1b16662c6 100644 --- a/tests/test_regrtest.py +++ b/tests/test_regrtest.py @@ -550,3 +550,14 @@ def test_regression_infer_dict_literal_comparison_uninferable() -> None: node = extract_node("{{}}>0") inferred = next(node.infer()) assert inferred.value == Uninferable + + +def test_regression_infer_namedtuple_invalid_fieldname_error() -> None: + """Regression test for issue #2519.""" + code = """ + from collections import namedtuple + namedtuple('a','}') + """ + node = extract_node(code) + inferred = next(node.infer()) + assert inferred.value == Uninferable