diff --git a/jedi/evaluate/compiled/access.py b/jedi/evaluate/compiled/access.py index 7d2e6809..e28fd994 100644 --- a/jedi/evaluate/compiled/access.py +++ b/jedi/evaluate/compiled/access.py @@ -9,6 +9,7 @@ from jedi._compatibility import unicode, is_py3, builtins, \ py_version, force_unicode from jedi.evaluate.compiled.getattr_static import getattr_static +ALLOWED_GETITEM_TYPES = (str, list, tuple, unicode, bytes, bytearray, dict) MethodDescriptorType = type(str.replace) # These are not considered classes and access is granted even though they have @@ -226,7 +227,7 @@ class DirectObjectAccess(object): return self.py__iter__list() def py__simple_getitem__(self, index): - if type(self._obj) not in (str, list, tuple, unicode, bytes, bytearray, dict): + if type(self._obj) not in ALLOWED_GETITEM_TYPES: # Get rid of side effects, we won't call custom `__getitem__`s. return None @@ -236,7 +237,7 @@ class DirectObjectAccess(object): if not hasattr(self._obj, '__getitem__'): return None - if type(self._obj) not in (str, list, tuple, unicode, bytes, bytearray, dict): + if type(self._obj) not in ALLOWED_GETITEM_TYPES: # Get rid of side effects, we won't call custom `__getitem__`s. return [] diff --git a/jedi/evaluate/compiled/mixed.py b/jedi/evaluate/compiled/mixed.py index 474c9951..9146830f 100644 --- a/jedi/evaluate/compiled/mixed.py +++ b/jedi/evaluate/compiled/mixed.py @@ -12,10 +12,12 @@ from jedi.evaluate import compiled from jedi.cache import underscore_memoization from jedi.file_io import FileIO from jedi.evaluate.base_context import ContextSet, ContextWrapper +from jedi.evaluate.helpers import SimpleGetItemNotFound from jedi.evaluate.context import ModuleContext from jedi.evaluate.cache import evaluator_function_cache from jedi.evaluate.compiled.getattr_static import getattr_static -from jedi.evaluate.compiled.access import compiled_objects_cache +from jedi.evaluate.compiled.access import compiled_objects_cache, \ + ALLOWED_GETITEM_TYPES from jedi.evaluate.compiled.context import create_cached_compiled_object from jedi.evaluate.gradual.conversion import to_stub @@ -56,6 +58,12 @@ class MixedObject(ContextWrapper): else: return self.compiled_object.get_safe_value(default) + def py__simple_getitem__(self, index): + python_object = self.compiled_object.access_handle.access._obj + if type(python_object) in ALLOWED_GETITEM_TYPES: + return self.compiled_object.py__simple_getitem__(index) + raise SimpleGetItemNotFound + def __repr__(self): return '<%s: %s>' % ( type(self).__name__, diff --git a/test/test_api/test_interpreter.py b/test/test_api/test_interpreter.py index cb44bb9c..1bf73713 100644 --- a/test/test_api/test_interpreter.py +++ b/test/test_api/test_interpreter.py @@ -176,7 +176,6 @@ def test_getattr(): _assert_interpreter_complete('getattr(Foo1, baz).app', locals(), ['append']) -@pytest.mark.xfail(reason='For now slicing on strings is not supported for mixed objects') def test_slice(): class Foo1: bar = []