python - python jedi,动态属性的自动完成
问题描述
我正在尝试写一个类。该类的对象可以采用标签/值对并将其存储label
为可以作为属性访问的方式,返回value
:obj.label -> value
这里的主要目标是在 jupyter 笔记本中获得自动完成功能,因此obj.<tab>
应该生成标签列表作为自动完成建议。下面的类实现了这一点:
class Autocompleter:
def __init__(self, ):
self._funcs = {}
def add(self, label):
self._funcs[label] = 1.
def __dir__(self):
return list(self._funcs.keys())
def __getattr__(self, name):
if name in dir(self):
return self._funcs[name]
问题:访问无效属性时,__getattr__
简单地返回None
. 我宁愿让它抛出一个异常。我可以想到 2 种方法来实现这一点,但不幸的是,两者都破坏了自动完成功能:
更改__getattr__
为:
def __getattr__(self, name):
return self._funcs[name]
或者
def __getattr__(self, name):
if name in dir(self):
return self._funcs[name]
else:
raise Exception('invalid name')
产生所需的异常,但会破坏自动完成:
a = Autocompleter()
a.add('foo')
现在a.<tab>
不建议foo
自动完成,它根本什么都不做。据我所知,jedi 默认用于 jupyterlab 中的自动完成。
问题:有没有办法让无效名称的异常和自动完成功能都工作?
解决方案
我自己想通了。处理无效属性名称的正确方法是引发 AttributeError。这点绝地就可以理解了。
def __getattr__(self, name):
if name in dir(self):
return self._funcs[name]
raise AttributeError(name)
请注意,__dir__
仍然需要该方法。
推荐阅读
- verilog - 将大组合逻辑分解成小逻辑真的可以减少延迟吗?
- reactjs - 从 React.js UseEffect Hook 中创建的事件处理程序访问状态
- jquery - 根据文本量附加表格列
- python - 为什么我找不到
在这个 html 示例中的标签内?
- python - 尝试使用 win32com 使用 Python 调度 SASEGObjectModel COM 对象的问题
- sql - 想从表中选择,但它忽略了它
- javascript - 部署到 Heroku 后节点/apollo/express 服务器的 Cookie 问题
- c# - 无法在脚本中使用视频播放器播放音频
- html - 将 Apache Mod Rewrite 规则转换为 NGINX
- angular - 如何从服务插值这个数组