Ipython: Penyelesaian tab untuk jalur rusak lagi di 7.2.0

Dibuat pada 14 Des 2018  ·  32Komentar  ·  Sumber: ipython/ipython

Penyelesaian tab untuk jalur dalam string tampaknya diputus lagi (sebelumnya disebutkan di banyak tempat, seperti # 10961, # 10996, masalah notebook # 3333 ). Inilah yang saya dapatkan di v7.2.0 :

screen shot 2018-12-14 at 12 39 17 pm

Dibandingkan dengan perilaku di v7.1.1 :

screen shot 2018-12-14 at 12 38 20 pm

Mungkin terkait dengan # 11503, karena menonaktifkan Jedi (menyetel c.IPCompleter.use_jedi = False dalam ipython_config.py ) memberikan perilaku yang benar.

Sistem Informasi

{'commit_hash': '523ed2fe5',
 'commit_source': 'installation',
 'default_encoding': 'UTF-8',
 'ipython_path': '/usr/local/lib/python3.6/site-packages/IPython',
 'ipython_version': '7.2.0',
 'os_name': 'posix',
 'platform': 'Darwin-17.7.0-x86_64-i386-64bit',
 'sys_executable': '/usr/local/opt/python/bin/python3.6',
 'sys_platform': 'darwin',
 'sys_version': '3.6.5 (default, Jun 17 2018, 12:13:06) \n'
                '[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]'}

help wanted tab-completion

Komentar yang paling membantu

Menurunkan versi ke ipython == 7.1.1 tampaknya berfungsi sebagai perbaikan bagi saya.

Semua 32 komentar

Saya memiliki masalah yang sama, ipython 7.2.0.

Menurunkan versi ke ipython == 7.1.1 tampaknya berfungsi sebagai perbaikan bagi saya.

Bisakah seseorang berbagi jika mengaktifkan jedi membantu alur kerja mereka, dan jika ya, saya ingin tahu caranya?

Ini tentu saja membuat hidup saya jauh lebih sulit: tidak ada penyelesaian multi-level, tidak ada penyelesaian folder, saya juga tidak dapat menggunakan pelengkapan otomatis sebelum menjalankan sel ( df = pd.DataFrame(); df.val<TAB> gagal)

Bug itu tentu saja membuat hidup saya jauh lebih sulit juga.

pelengkapan otomatis mungkin adalah salah satu fitur terpenting dari shell interaktif. Adakah cara Jedi dan penyelesaian otomatis jalur bisa hidup berdampingan?
Beberapa heuristik yang sangat sederhana dalam memutuskan untuk menggunakan jedi atau penyelesaian warisan akan sangat membantu: jika seseorang berada dalam sebuah string, maka tidak mungkin seseorang menginginkan nama dari namespace saat ini.

Bagi mereka yang mengalami masalah dengan penurunan versi, saya menemukan komentar @ivirshup paling membantu - untuk menonaktifkan pelengkapan otomatis jedi di konfigurasi ipython. Jika Anda belum melakukannya, Anda dapat menghasilkan ipython_config.py dengan:

# Generate config
ipython profile create
# Edit config file in vim
vim .ipython/profile_default/ipython_kernel_config.py 

Dan ubah c.IPCompleter.use_jedi = False ipython_config.py

[Pelengkap jedi] tentu saja membuat hidup saya jauh lebih sulit: tidak ada penyelesaian multi-level, tidak ada penyelesaian folder, […]

Tidak tidak Tidak. Bukan pelengkap jedi yang melakukan itu. Ada beberapa pelengkap dan Anda menjelaskan bahwa pelengkap yang salah dipilih karena kode pemilihan pelengkap rusak. Dan menyentuh daftar pelengkap dengan mengaktifkan jedi menemukan bug itu. @takluyver menjelaskan masalahnya di https://github.com/ipython/ipython/pull/10996#issuecomment -378288569.

Menonaktifkan jedi lagi adalah solusi sementara, tetapi sebenarnya memperbaiki kode pilihan yang lebih lengkap (# 11064 menurut saya) tentu saja akan menjadi solusi yang jauh lebih baik.

Pemahaman saya adalah bahwa semua pelengkap bekerja pada waktu yang sama. Pelengkap didefinisikan di sini , dan semuanya digunakan pada waktu yang sama . Daftar matches (hasil penyelesaian otomatis) akan berisi rangkaian dari semua hasil pelengkap, dan pelengkap file_matches masih menjadi bagian darinya.

Jadi penyelesaian path / nama file tidak "rusak" saat jedi diaktifkan, hanya saja ada begitu banyak hasil (yang berasal dari jedi) sehingga Anda tidak dapat melihat lagi path file yang cocok.

Ide pertama saya untuk memperbaikinya adalah menonaktifkan pelengkapan otomatis jedi saat mengetik dalam string? Apakah itu berhasil?
Satu-satunya hal yang tidak akan berfungsi adalah pelengkapan otomatis saat menjalankan kode dengan eval atau exec , tetapi saya pikir kami tidak dapat memperbaiki setiap kasus penggunaan. Dan sepertinya beberapa orang menyukai penyelesaian otomatis jalur file.

EDIT: Membaca masalah lain yang Anda tautkan ke @ flying-sheep # 11064, saya mengerti bahwa sudah ada logika untuk tidak menggunakan jedi saat mengetik dalam string, tetapi rusak?

Hanya untuk menggambarkan apa yang saya katakan. Kedua screenshot tersebut diambil dengan menggunakan jedi, anda melihat bahwa jalur penyelesaian otomatis masih berfungsi, anda hanya perlu mengetik sedikit lagi karena terdapat lebih banyak kecocokan.
test1
test2

Itu umumnya masalah saya: mengetik sedikit membantu, tetapi itu tidak selalu menjadi pilihan jika Anda tidak tahu huruf pertama file. Bahkan jika Anda dengan jelas mulai mengetik jalur, setelah setiap "/" pelengkap "me-reset" ke mode default yang menunjukkan abs (), semua () dan bawaan lainnya.
image

Ini adalah masalah besar jika Anda memiliki jalur yang panjang dengan beberapa folder bersarang. Pelengkapan otomatis Bash hanya akan menambahkan sesuatu di "tab". Dengan ipython autocomplete saat ini Anda harus mengingat huruf pertama atau beberapa dari setiap folder / file, ketikkan, dan kemudian masih berkeliling beberapa bawaan sebelum Anda menemukan file / folder Anda.

Jika ada cara untuk menghapus semua bawaan dari pelengkapan otomatis, dan semua sihir ipython - itu sudah jauh lebih baik!

Saya tahu cara mengetik 'abs', dan kebanyakan dari kita dapat mengetiknya beberapa kali lebih cepat daripada memilihnya dari daftar pelengkapan otomatis. Saya tidak yakin ada alasan bagus untuk itu, dan bawaan 3-4 huruf lainnya, untuk berada di sana sejak awal! Idealnya, jika ada cara untuk mengedit daftar bawaan, saya hanya akan meninggalkan beberapa nama panjang yang saya gunakan, seperti DepercationWarning, dan menyingkirkan yang lainnya.

Lihat saja use case pada gambar: Mengapa saya ingin mengetikkan nama objek Python di dalam string literal?

Saya dapat menemukan kasus penggunaan sederhana:

exec("print(abs(-3))", [globals()])

Mungkin ini kasus penggunaan yang kurang umum, tetapi itu bisa terjadi. Saya setuju bahwa penyelesaian jalur lebih penting daripada kasus penggunaan ini untuk sebagian besar pengguna.

Ya, itu kemungkinan, dan beberapa orang sangat bergantung pada eksekutif.

Idealnya, pelengkapan otomatis harus mendeteksi bahwa itu dalam mode nama file, dan dari sana berfungsi seperti penyelesaian tab bash normal. Proksi yang baik dimulai dengan "/", "./" atau "C:" "D:" dll.

Bahkan kecil kemungkinannya string yang dimulai dengan variabel ini akan berisi ekspresi python yang valid.

Saya yakin seseorang dapat membuat contoh a = "C:print(abs(-3))"; exec(a[2:]) tetapi itu sangat tidak mungkin.

Ya, sebenarnya kode tersebut seharusnya melewatkan penyelesaian jedi saat Anda mengetik string. Lihat baris ini: https://github.com/ipython/ipython/blob/65778adec13a65f82c5d2bab123e7a63516702c8/IPython/core/completer.py#L1375
Dan itu bergantung pada logika parsing internal jedi untuk mencoba mencari tahu apakah kita berada dalam sebuah string atau tidak.
Saya menguji kode ini sedikit dan ternyata sedikit rusak, misalnya saat mengetik path = " akan terlihat bahwa Anda berada dalam string, tetapi tidak dengan path = "./ . Saya kira kita bisa menemukan solusi yang lebih baik menggunakan tokenize .

Apakah karena Jedi tidak menganggapnya sebagai ErrorLeaf, atau karena kembali dengan dua node tidak cukup?

Saya tidak yakin, dan saya dengan cepat mengalihkan pikiran saya ke tokenize karena saya tidak suka fakta bahwa ini bergantung pada hal-hal internal jedi (API pribadi).

tokenisasi juga memiliki masalah. Bagaimana jika sel memunculkan IndentationError atau SyntaxError sebelum pembukaan string?

Anda mungkin perlu mundur baris secara bertahap, tetapi kemudian Anda selalu mengharapkan kesalahan di dekat kursor karena deklarasi string yang tidak lengkap?

Dengan tokenisasi, saya memikirkan logika sederhana seperti yang dilakukan di inputtransformer2.py . Ada beberapa logika untuk mengetahui apakah pengguna sedang mengetik daftar atau kamus di terminal, sehingga ketika menekan enter Anda tidak mengeksekusi kode, Anda meletakkan baris baru:
test1
test2
Mungkin kita bisa mencoba sesuatu yang setara dengan karakter " dan ' (saya bisa mencoba membuat PR).

Juga ide lain bisa menggunakan regexp, saya tidak akan berguna dalam kasus ini: P

tokenisasi juga memiliki masalah. Bagaimana jika sel memunculkan IndentationError atau SyntaxError sebelum pembukaan string

Saya kira itu tidak akan lengkap ... Bagaimana perilaku saat ini? Apakah pelengkapan otomatis masih berfungsi saat Anda memiliki SyntaxError di kode Anda? Kita harus memeriksanya

Masalah yang sama setelah memperbarui ke 7.3.0.

Ya itu berfungsi ketika Anda memiliki SyntaxError.

Screenshot from 2019-03-28 10-48-20

IIRC tokenize cukup kuat tentang kesalahan sintaks - jenis potongan yang Anda tampilkan masih dapat diberi token dengan baik, kesalahan hanya akan muncul ketika Anda mencoba memahami token.

Saya tidak yakin apa yang akan dilakukannya dengan sesuatu seperti string yang tidak diselesaikan pada baris sebelumnya, yang mungkin merupakan kesalahan sintaks pada tingkat tokenisasi.

Masalah serupa dengan penginstalan conda terbaru:

python                    3.7.3
ipykernel                 5.1.0              
ipython                   7.4.0           

Saya sebenarnya tidak mendapatkan penyelesaian tab sama sekali. Hanya dalam sebuah fungsi (shift + double-tab) saya mendapatkan penyelesaian docstring. Tidak ada penyelesaian metode pada objek sama sekali. Jalur pengetikan dalam string berfungsi seperti yang diharapkan, yaitu tidak ada variabel global yang terdaftar.

Masalah tetap ada di IPython 7.7.0 yang diinstal melalui conda:

ipython                   7.7.0            py37h5ca1d4c_0    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
jedi                      0.14.1                   py37_0    conda-forge
python                    3.7.3                h33d41f4_1    conda-forge

Dan itu akan sampai masalah ini dan # 10926 ditutup. @ JeremySikes73 dan saya memberikan beberapa penjelasan tentang apa yang salah, dan saya cukup yakin masalahnya sama: Pencocokan IPython semua mengembalikan hasil sementara kita harus a) menjalankan hanya yang relevan atau b) menambahkan kode ke pencocokan yang membuat mereka tidak mengembalikan apa-apa ketika hasil mereka tidak relevan.

Terima kasih telah mencoba membantu, tetapi menurut saya lebih produktif untuk membaca # 10926, menyelami kode dan mencari tahu bagaimana memperbaiki situasi daripada mengatakan "ini masih menjadi masalah".

Bantuan tag

Pelengkapan tab

Bagi mereka yang mengalami masalah dengan penurunan versi, saya menemukan komentar @ivirshup paling membantu - untuk menonaktifkan pelengkapan otomatis jedi di konfigurasi ipython. Jika Anda belum melakukannya, Anda dapat menghasilkan ipython_config.py dengan:

# Generate config
ipython profile create
# Edit config file in vim
vim .ipython/profile_default/ipython_kernel_config.py 

Dan ubah c.IPCompleter.use_jedi = False ipython_config.py

File mana yang akan diedit? ipython_kernel_config.py atau ipython_config.py ?

Solusi sementara untuk masalah ini adalah dengan menambahkan garis miring kedua setelah menekan tab.

Setelah mengetik '/<TAB>
image

Setelah mengetik /
image

Setelah item dipilih, hanya akan ada satu garis miring sebagai pemisah:

Setelah menekan kembali
image

Perhatikan bahwa menambahkan garis miring kedua sebelum menekan tab tidak mengubah menu pop-up.

Saya meningkatkan ke versi terbaru ipython mulai hari ini (7.11.0), dan masalah masih berlanjut.

@ flying-sheep @augustogoulart Apakah Anda terbuka untuk menarik permintaan ini? (Maksud saya, tag "helpwanted" menyarankan demikian, tapi saya bukan kontributor yang ada, jadi tidak yakin dengan norma pengembang di sini.) Saya memiliki beberapa perubahan kecil pada logika dalam mendeteksi apakah kita berada dalam string atau tidak , yang, meskipun bukan perbaikan yang sempurna, setidaknya melakukan pekerjaan yang lebih baik dalam mematikan jedi.

Ini tidak sepenuhnya memperbaiki # 10926 atau ini, karena alangkah baiknya jika dimatikan (menurut pendapat saya):

  • penyelesaian file cocok ketika dalam string kunci kamus
  • penyelesaian sihir cocok dengan string apa pun

tetapi setidaknya mematikan jedi ketika dalam sebuah string, yang sangat membantu dalam membuat pola penggunaan saya sendiri bisa diterapkan.

Saya sendiri hanyalah kontributor kecil-kecilan, tetapi saya yakin mereka membutuhkan bantuan untuk memperbaikinya!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat