选项卡Python类中__getitem__的完整键

时间:2017-03-13 18:48:29

标签: python readline prompt-toolkit

我正在实现一个包含2d numpy数组(self.data)的python类,我已经使用字符串键设置了列访问权限。 密钥包含在将名称映射到列索引的字典中(例如,self.coldict={'col0':0,...,'colN':N}),并且我已经定义了

def __getitem__(self,key):
   if isinstance(key,str):
       return self.data[:,self.coldict[key]]
   elif isinstance(key,int):
       return self.data[:,key]

这适用于列检索。

我希望能够使用tab完成键,以便我可以输入 在iPython会话期间myObject['c+TAB获取完成选项。

我认为解决方案应该依赖于readline或prompt_toolkit,但是我不清楚如何在不覆盖iPython中已经活动的功能的情况下实现完成函数。

非常感谢任何帮助。 谢谢!

2 个答案:

答案 0 :(得分:1)

我不确定您是否可以为__getitem__标签填写字符串。制表符完成通常用于对象属性。选项卡完成使用__dict__实例字典和__dir__(self)方法中定义的项目。

如果您希望通过标签完成来访问属性。

class MyArray:
    ...
    def __dir__(self):
        return super().__dir__() + list(self.coldict.keys())

    def __getattr__(self, name):
        if name in self.coldict:
            return self.data[:,self.coldict[name]]
        return super().__getattr__(name)

然后,您将使用

访问您的列
arr = MyArray() # My numpy array
print(arr.col0) # col0 should allow for tab complete.

答案 1 :(得分:0)

很难追踪,但这是完成的过程(参考12):

  

您还可以自定义对象的关键完成,例如在obj["a之后按Tab。为此,请定义方法_ipython_key_completions_(),该方法返回一个对象列表,这些对象可能是下标表达式obj[key]中的键。

我通过在自定义类中简单地添加一个名为_ipython_key_completions_的方法来完成此工作,该方法返回调用__getitem__时可以使用的所有可能的字符串键。我没有意识到的是,Python dict和Pandas DataFrames都已经做到了。