Я уже некоторое время использую библиотеку ленивых свойств (https://pypi.org/project/lazy-property/). Она отлично работает, но в моем редакторе эти ленивые свойства не дают автозаполнения.
Мои настройкиэто Atom, использующий пакет ide-python (https://github.com/lgeiger/ide-python),, который управляется python-language-server (https://github.com/palantir/python-language-server),, который использует Jedi (https://github.com/davidhalter/jedi) для автозаполнения.
По сути, эта проблема должна воспроизводиться в любом контексте автозаполнения на основе джедаев.
Мне было интересно, можно ли как-нибудь переписать код в lazy-property (возможно, используя type-hints и whatnot)так что джедай мог понять, что тип, исходящий из метода с отложенными свойствами, должен быть таким же, как если бы декоратор отсутствовал.
Реализация этого декоратора на самом деле очень проста, в основном это просто:
class lazy_property(property):
def __init__(self, method, fget=None, fset=None, fdel=None, doc=None):
self.method = method
self.cache_name = f"_{self.method.__name__}"
doc = doc or method.__doc__
super().__init__(fget=fget, fset=fset, fdel=fdel, doc=doc)
update_wrapper(self, method)
def __get__(self, instance, owner):
if instance is None:
return self
if hasattr(instance, self.cache_name):
result = getattr(instance, self.cache_name)
else:
if self.fget is not None:
result = self.fget(instance)
else:
result = self.method(instance)
setattr(instance, self.cache_name, result)
return result
Есть ли у кого-нибудь идеи о том, как я могу провести рефакторинг этого класса, чтобы джедай понял, что он должен предполагать, что декоратор не меняет типЧто из возвращаемых значений?
Любая помощь будет высоко ценится, ура.