โมดูล 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