From e03afc60efefec8a2963325805d317a91bb3fdb9 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 13 Dec 2017 19:16:29 +0100 Subject: [PATCH] Make get_repr static in access. --- jedi/evaluate/compiled/access.py | 13 +++++++++++-- jedi/evaluate/compiled/getattr_static.py | 5 +++-- jedi/evaluate/compiled/subprocess/__init__.py | 7 +++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/jedi/evaluate/compiled/access.py b/jedi/evaluate/compiled/access.py index 36976b17..5dfa6b14 100644 --- a/jedi/evaluate/compiled/access.py +++ b/jedi/evaluate/compiled/access.py @@ -164,7 +164,7 @@ class DirectObjectAccess(object): self._obj = obj def __repr__(self): - return '%s(%s)' % (self.__class__.__name__, self._obj) + return '%s(%s)' % (self.__class__.__name__, self.get_repr()) def _create_access(self, obj): return create_access(self._evaluator, obj) @@ -231,7 +231,16 @@ class DirectObjectAccess(object): return [self._create_access_path(base) for base in self._obj.__bases__] def get_repr(self): - return repr(self._obj) + # Try to avoid execution of the property. + type_ = type(self._obj) + if type_ == type: + return type.__repr__(self._obj) + + builtins = 'builtins', '__builtin__' + if getattr_static(type_, '__module__', default='') in builtins: + # Allow direct execution of repr for builtins. + return repr(self._obj) + return object.__repr__(self._obj) def is_class(self): return inspect.isclass(self._obj) diff --git a/jedi/evaluate/compiled/getattr_static.py b/jedi/evaluate/compiled/getattr_static.py index 9f8cd8a8..795a35ce 100644 --- a/jedi/evaluate/compiled/getattr_static.py +++ b/jedi/evaluate/compiled/getattr_static.py @@ -10,6 +10,7 @@ from jedi._compatibility import py_version _sentinel = object() + def _check_instance(obj, attr): instance_dict = {} try: @@ -28,6 +29,7 @@ def _check_class(klass, attr): pass return _sentinel + def _is_type(obj): try: _static_getmro(obj) @@ -143,8 +145,7 @@ def getattr_static(obj, attr, default=_sentinel): if not _is_type(obj): klass = _get_type(obj) dict_attr = _shadowed_dict(klass) - if (dict_attr is _sentinel or - type(dict_attr) is types.MemberDescriptorType): + if (dict_attr is _sentinel or type(dict_attr) is types.MemberDescriptorType): instance_result = _check_instance(obj, attr) else: klass = obj diff --git a/jedi/evaluate/compiled/subprocess/__init__.py b/jedi/evaluate/compiled/subprocess/__init__.py index 27d7e262..d9100895 100644 --- a/jedi/evaluate/compiled/subprocess/__init__.py +++ b/jedi/evaluate/compiled/subprocess/__init__.py @@ -256,6 +256,13 @@ class AccessHandle(object): def add_subprocess(self, subprocess): self._subprocess = subprocess + def __repr__(self): + try: + detail = self.access + except AttributeError: + detail = '#' + str(self.id) + return '<%s of %s>' % (self.__class__.__name__, detail) + def __getstate__(self): return self.id