Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

GNU Readline Completion ใน Python (โมดูล rlcompleter)

โมดูล rlcompleter ให้ Tab Completion สำหรับ Python Interactive Mode ใช้ร่วมกับ readline

import rlcompleter


Completer Class

import rlcompleter

completer = rlcompleter.Completer()

# Complete Method
# complete(text, state) -> คืนค่า Completion ตัวที่ state (0-based)
# คืน None เมื่อหมดแล้ว

โค้ดตัวอย่าง: ทดสอบ Completion

import rlcompleter
import sys

completer = rlcompleter.Completer()

test_phrases = ['co', 'sys.m', 'cal', 'pri']

for phrase in test_phrases:
    print(f"{phrase} (TAB): ", end='')
    for i in range(20):
        result = completer.complete(phrase, i)
        if result is None:
            break
        print(result, end='\t')
    print()

ผลลัพธ์

co (TAB):     continue    compile(    complex(    copyright(   
sys.m (TAB):   sys.maxsize    sys.maxunicode    sys.meta_path    sys.modules    
cal (TAB):     callable(    
pri (TAB):     print(        property(

การเปิดใช้งานใน Interactive Shell

# ~/.pythonrc.py หรือ รันใน Shell
import readline
import rlcompleter

readline.parse_and_bind("tab: complete")
# หรือ
readline.set_completer(rlcompleter.Completer().complete)

การทำงาน

  • ไม่มี Dot (.): Complete Keywords, Builtins, Globals
  • มี Dot: Complete Attributes ของ Object (dir())
  • รองรับ Nested: os.path.j -> os.path.join

Custom Completer

class MyCompleter(rlcompleter.Completer):
    def complete(self, text, state):
        # Custom Logic
        if text.startswith('mycmd '):
            options = ['start', 'stop', 'restart', 'status']
            matches = [o for o in options if o.startswith(text[6:])]
            if state < len(matches):
                return matches[state]
        return super().complete(text, state)

readline.set_completer(MyCompleter().complete)

ข้อจำกัด

  • ทำงานได้เฉพาะ UNIX/Linux/macOS (ต้องมี readline/libedit)
  • Windows: ใช้ pyreadline3 หรือ prompt_toolkit แทน
  • Jupyter/IPython มี Completer ของตัวเอง (Jeditable)

Alternatives สำหรับ Modern CLI

  • prompt_toolkit - Full-featured, Syntax Highlight, Auto-suggest
  • click - CLI Framework พร้อม Completion
  • argcomplete - Argparse Tab Completion