【问题标题】:Duplicate output on Python tab completion (OsX 10.8)Python选项卡完成时的重复输出(OsX 10.8)
【发布时间】:2023-03-29 16:25:02
【问题描述】:

使用下面的 sn-p,我在 python 解释器中添加了 tab 补全。

import readline
import rlcompleter
if 'libedit' in readline.__doc__:
    readline.parse_and_bind("bind ^I rl_complete")
else:
    readline.parse_and_bind("tab: complete")

但是,我遇到了一个奇怪的行为,在点击 TAB 后,解释器会给出这样的重复:

Python 2.7.3 (v2.7.3:70274d53c1dd, Apr  9 2012, 20:52:43)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> d=dict()
>>> d.
Display all 108 possibilities? (y or n)
d.__class__(         d.__class__(         d.__class__(
d.__class__(         d.__cmp__(           d.__cmp__(
d.__contains__(      d.__contains__(      d.__delattr__(
d.__delattr__(       d.__delattr__(       d.__delitem__(
d.__delitem__(       d.__doc__            d.__doc__
d.__doc__            d.__eq__(            d.__eq__(
d.__format__(        d.__format__(        d.__format__(
d.__ge__(            d.__ge__(            d.__getattribute__(
d.__getattribute__(  d.__getattribute__(  d.__getitem__(
d.__getitem__(       d.__gt__(            d.__gt__(
d.__hash__           d.__hash__           d.__hash__
d.__init__(          d.__init__(          d.__init__(
d.__iter__(          d.__iter__(          d.__le__(
d.__le__(            d.__len__(           d.__len__(
d.__lt__(            d.__lt__(            d.__ne__(
d.__ne__(            d.__new__(           d.__new__(
d.__new__(           d.__reduce__(        d.__reduce__(
d.__reduce__(        d.__reduce_ex__(     d.__reduce_ex__(
d.__reduce_ex__(     d.__repr__(          d.__repr__(
d.__repr__(          d.__setattr__(       d.__setattr__(
d.__setattr__(       d.__setitem__(       d.__setitem__(
d.__sizeof__(        d.__sizeof__(        d.__sizeof__(
d.__str__(           d.__str__(           d.__str__(
d.__subclasshook__(  d.__subclasshook__(  d.__subclasshook__(
d.clear(             d.clear(             d.copy(
d.copy(              d.fromkeys(          d.fromkeys(
d.get(               d.get(               d.has_key(
d.has_key(           d.items(             d.items(
d.iteritems(         d.iteritems(         d.iterkeys(
d.iterkeys(          d.itervalues(        d.itervalues(
d.keys(              d.keys(              d.pop(
d.pop(               d.popitem(           d.popitem(
d.setdefault(        d.setdefault(        d.update(
d.update(            d.values(            d.values(
d.viewitems(         d.viewitems(         d.viewkeys(
d.viewkeys(          d.viewvalues(        d.viewvalues(

108 种可能性!最少 2 个,最多 4 个重复项。

此外,

  • 如果我将dict 子类化,则可能性总数增加到 160(然后增加到 209、258)。
  • 如果我为 TAB 键入足够多的字符来确定命令,它不会显示重复项。

感谢任何指针或调试提示。

【问题讨论】:

    标签: python macos readline tab-completion


    【解决方案1】:

    我通过添加自定义完成器解决了这个问题。它现在按预期工作。

    import readline
    import rlcompleter
    
    c = rlcompleter.Completer()
    
    def complete(text, state):
        buffer = readline.get_line_buffer()
        first = c.complete(buffer, 0)
        if state == 0:
            return first
        current = c.complete(buffer, state)
        if current != first:
            return current
    
    readline.parse_and_bind('bind ^I rl_complete')
    readline.set_completer(complete)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 2012-06-12
      • 1970-01-01
      相关资源
      最近更新 更多