diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index c0509e65..959e7d9f 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -169,7 +169,7 @@ class Instance(use_metaclass(CachedMetaClass, Executed)): """ Throws a KeyError if there's no method. """ # Arguments in __get__ descriptors are obj, class. # `method` is the new parent of the array, don't know if that's good. - args = [obj, obj.base] if isinstance(obj, Instance) else [None, obj] + args = [obj, obj.base] if isinstance(obj, Instance) else [compiled.none_obj, obj] return self.execute_subscope_by_name('__get__', args) def scope_names_generator(self, position=None): diff --git a/test/completion/descriptors.py b/test/completion/descriptors.py index 650f987d..86e3a3d0 100644 --- a/test/completion/descriptors.py +++ b/test/completion/descriptors.py @@ -180,3 +180,40 @@ E.t(1) e.u(1) #? str() E.u(1) + +# ----------------- +# Conditions +# ----------------- + +from functools import partial + + +class Memoize(): + def __init__(self, func): + self.func = func + + def __get__(self, obj, objtype): + if obj is None: + return self.func + + return partial(self, obj) + + def __call__(self, *args, **kwargs): + # We don't do caching here, but that's what would normally happen. + return self.func(*args, **kwargs) + + +class MemoizeTest(): + def __init__(self, x): + self.x = x + + @Memoize + def some_func(self): + return self.x + + +#? int() +MemoizeTest(10).some_func() +# Now also call the same function over the class (see if clause above). +#? float() +MemoizeTest.some_func(MemoizeTest(10.0))