3

我正在实现一个包含 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]

这适用于列检索。

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

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

任何帮助深表感谢。谢谢!

4

2 回答 2

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.
于 2017-03-13T19:06:43.120 回答
1

很难追查,但这就是它的完成方式(参考12):

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

我通过简单地添加一个调用_ipython_key_completions_到自定义类的方法来实现这个工作,该类返回调用时可以使用的所有可能的字符串键__getitem__。我没有意识到 Pythondict和 Pandas DataFrames 已经做到了这一点。

于 2019-10-29T04:21:40.223 回答