【问题标题】:tab complete key for __getitem__ in Python classPython 类中 __getitem__ 的制表符完成键
【发布时间】:2017-03-13 18:48:28
【问题描述】:

我正在实现一个包含 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 中已经激活的功能的情况下实现一个完整的功能。

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

【问题讨论】:

    标签: python readline prompt-toolkit


    【解决方案1】:

    我不确定您是否可以通过制表符完成__getitem__ 的字符串。制表符完成通常用于对象属性。 Tab 补全使用__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.
    

    【讨论】:

    • 谢谢!这是一个很好的解决方法。 Pandas 具有我正在寻找的为数据帧实现的行为,但我还没有设法在源代码中找到该代码。这确实表明这是可能的(尽管这并不意味着它很容易!)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 请注意,如果您还定义了类的__getattr__(),那么_ipython_key_completions_ 将无法正常工作。
    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 2018-02-08
    • 2020-07-02
    • 1970-01-01
    • 2010-10-15
    • 2013-08-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多