it-swarm-id.com

Bagaimana cara mengkode pelengkapan otomatis dalam python?

Saya ingin mengkode pelengkapan otomatis di terminal Linux. Kode harus berfungsi sebagai berikut.

Ia memiliki daftar string (mis. "Halo," hai "," apa kabar "," selamat tinggal "," hebat ", ...).

Di terminal, pengguna akan mulai mengetik dan ketika ada beberapa kemungkinan kecocokan, ia mendapatkan petunjuk untuk kemungkinan string, dari mana ia dapat memilih (sama seperti di editor vim atau pencarian tambahan google ).

misalnya dia mulai mengetik "h" dan dia mendapat petunjuk

halo"

_ "i"

_ "Bagaimana kabarmu"

Dan lebih baik lagi jika itu akan menyelesaikan kata-kata tidak hanya dari awal tetapi dari bagian acak dari string.

Terima kasih atas sarannya.

31
xralf

(Sono consapevole che questo non è esattamente quello che stai chiedendo, ma) Se sei soddisfatto del completamento automatico/dei suggerimenti visualizzatiTAB(ayo usato in Shell molte), lalu gunakan cepat untuk mengaktifkan kami menggunakan modul --- baca baris .

Ecco un rapido esempio basato su Pygotw menulis di Doug Hellmann su readline .

import readline

class MyCompleter(object):  # Custom completer

    def __init__(self, options):
        self.options = sorted(options)

    def complete(self, text, state):
        if state == 0:  # on first trigger, build possible matches
            if text:  # cache matches (entries that start with entered text)
                self.matches = [s for s in self.options 
                                    if s and s.startswith(text)]
            else:  # no text entered, all matches possible
                self.matches = self.options[:]

        # return match indexed by state
        try: 
            return self.matches[state]
        except IndexError:
            return None

completer = MyCompleter(["hello", "hi", "how are you", "goodbye", "great"])
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')

input = raw_input("Input: ")
print "You entered", input

Tambahkan ke daftar Comportamento (<TAB> che rappresenta un tasto tab premuto):

Input: <TAB><TAB>
goodbye      great        hello        hi           how are you

Input: h<TAB><TAB>
hello        hi           how are you

Input: ho<TAB>ow are you

Nell'ultima riga (HOTABinserito), kata kunci "Kemungkinan" dengan frase "Come stai" viene completata automaticamente.

Controlla gli articoli collegati per ulteriori informazioni su readline.


"Ini adalah cara yang tepat untuk menyelesaikan Parole dan solo dall'inizio ... completamento da parte arbitraria della stringa."

Semua pertanyaan terkait dengan modifikasi yang Anda butuhkan di Corrispondenza nella funzione di completamento, cioè. a partire dal:

self.matches = [s for s in self.options 
                   if s and s.startswith(text)]

a qualcosa di simile:

self.matches = [s for s in self.options 
                   if text in s]

Questo ti darà il seguente comportamento:

Input: <TAB><TAB>
goodbye      great        hello        hi           how are you

Input: o<TAB><TAB>
goodbye      hello        how are you

Aggiornamenti: utilizzo del buffer della cronologia (datang menzionato nei commenti)

Tanpa modo semple per buat uno pseudo-menu per lo scorrimento/ricerca and caricare le Parole chiave nel buffer della cronologia. Baca lebih banyak di scorrere le voci utilizzando i tasti freccia su/giù e l'usoCtrl+Rper eseguire una ricerca inversa.

Namun, Anda perlu modifikasi:

keywords = ["hello", "hi", "how are you", "goodbye", "great"]
completer = MyCompleter(keywords)
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
for kw in keywords:
    readline.add_history(kw)

input = raw_input("Input: ")
print "You entered", input

Quando esegui lo script, prova a digitareCtrl+rseguito daa. Kembali ke atas "prima corrispondenza che contiene" a ". mengaksesiCtrl+rdi nuovo per la prossima partita. Per seleionion una voce, premereENTER.

Anda mungkin bisa menggunakan SU/GIÙ per scorrere le Parole chiave.

45
Shawn Chin

Saya kira Anda perlu mendapatkan kunci yang ditekan oleh pengguna.

Anda dapat mencapainya (tanpa menekan enter) dengan metode seperti ini:

import termios, os, sys

def getkey():
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ICANON & ~termios.ECHO
    new[6][termios.VMIN] = 1
    new[6][termios.VTIME] = 0
    termios.tcsetattr(fd, termios.TCSANOW, new)
    c = None
    try:
        c = os.read(fd, 1)
    finally:
        termios.tcsetattr(fd, termios.TCSAFLUSH, old)
    return c

Kemudian, jika kunci ini adalah kunci tab (misalnya, itu adalah sesuatu yang perlu Anda implementasikan), maka tampilkan semua kemungkinan kepada pengguna. Jika itu kunci lain, cetak di stdout.

Oh, tentu saja Anda harus membuat getkey () diulang sebentar, selama pengguna mengklik masuk. Anda juga bisa mendapatkan metode seperti raw_input, yang akan mendapatkan seluruh tanda Word dengan tanda, atau menampilkan semua kemungkinan, ketika Anda menekan tab.

Setidaknya itu itemnya, Anda bisa mulai dengan. Jika Anda mencapai masalah lain, daripada menulis tentang mereka.

EDIT 1:

Metode get_Word dapat terlihat seperti ini:

def get_Word():
    s = ""
    while True:
        a = getkey()
        if a == "\n":
            break
        Elif a == "\t":
            print "all possibilities"
        else:
            s += a

    return s

Word = get_Word()
print Word

Masalah yang saya alami sekarang adalah cara untuk menampilkan tanda, Anda baru saja memasukkan tanpa memasukkan dan spasi, apa yang print a dan print a, dilakukan.

6
Gandi

Untuk mengaktifkan pelengkapan otomatis dalam Python Shell, ketik ini:

import rlcompleter, readline
readline.parse_and_bind('tab:complete')

(terima kasih kepada http://blog.e-Shell.org/221 )

4
Nicolas S

Tangga:

  1. Buat file .pythonrc di direktori home dengan perintah ini: vi .pythonrc

  2. Masukkan konten ini: 

    import rlcompleter, readline  
    readline.parse_and_bind('tab:complete') 
    
  3. Tutup file

  4. Sekarang jalankan 

    echo "export PYTHONSTARTUP=~/.pythonrc" >> ~/.bashrc

  5. Mulai ulang terminal

2
AMAN JAIN

Bagi mereka (seperti saya) yang berakhir di sini mencari pelengkapan otomatis dalam juru bahasa:

https://web.archive.org/web/20140214003802/http://conjurecode.com/enable-auto-complete-in-python-interpreter/

Ini melibatkan membuat file .pythonrc, memodifikasi .bashrc dan import sys yang harus Anda impor setiap kali Anda meluncurkan juru bahasa Python.

Saya ingin tahu apakah yang terakhir dapat otomatis untuk kemenangan lebih banyak.

1
Mark Jeronimus