diff --git a/beniget/beniget.py b/beniget/beniget.py index e7714d3..5482bf0 100644 --- a/beniget/beniget.py +++ b/beniget/beniget.py @@ -202,6 +202,15 @@ def _str(self, nodes): # this should probably be assigned to the filename give to DefUseChains instead. Builtins["__file__"] = __file__ +# Cope with conditionally existing builtins by special-casing them. +Builtins.setdefault('WindowsError', OSError) # never defined under Linux +Builtins.setdefault('anext', next) # added in Python 3.10 +Builtins.setdefault('aiter', iter) # added in Python 3.10 +Builtins.setdefault('EncodingWarning', Warning) # added in Python 3.10 +Builtins.setdefault('PythonFinalizationError', RuntimeError) # added in Python 3.13 +# beniget doesn't run Python 3.5 and below, so we don't need to +# account for names introduced before Python 3.6 + DeclarationStep, DefinitionStep = object(), object() def collect_future_imports(node): diff --git a/tests/test_chains.py b/tests/test_chains.py index 396f66d..544e661 100644 --- a/tests/test_chains.py +++ b/tests/test_chains.py @@ -1548,6 +1548,17 @@ class Point: 'x -> ( -> (), x -> ( -> ()))', 'y -> ( -> (), y -> ( -> ()))']) + def test_WindowsError_builtin_name(self): + # Tests for issue https://github.com/serge-sans-paille/beniget/issues/119 + code = 'try: 1/0\nexcept WindowsError as e: raise' + self.check_message(code, []) + + def test_newer_Python_version_builtin_name(self): + # Tests for issue https://github.com/serge-sans-paille/beniget/issues/119 + code = ('try: 1/0\nexcept (PythonFinalizationError, EncodingWarning) as e: raise\n' + 'a,b = anext(), aiter()') + self.check_message(code, []) + class TestDefUseChainsStdlib(TestDefUseChains): ast = _ast