Ipython: Tidak dapat membuat blok kode multi-baris di ipython

Dibuat pada 27 Sep 2018  ·  26Komentar  ·  Sumber: ipython/ipython

Saya baru saja melakukan pip install ipython saat mengajar kelas hari ini dan mengetik pernyataan if dan kemudian tekan enter setelah baris pertama dan kode dieksekusi.

Sepertinya ini bug.

Saya melakukan pip install ipython==6.5.0 dan menekan Enter dalam blok kode dengan benar menunjukkan kepada saya baris indentasi berikutnya untuk diketik.

Saya menggunakan Ubuntu 18.04 menjalankan ipython dalam tmux, meskipun saya ragu tmux adalah masalahnya di sini.

Hacktoberfest help wanted

Komentar yang paling membantu

Sebenarnya, saya mendapat regresi dengan perbaikan saya. Perbaiki sekarang.

PR # 11354 diperbarui sekarang.

Semua 26 komentar

Anda dapat menggunakan ctrl-o untuk memaksa baris baru.

Saya tidak akan pernah menyangka yang itu. Saya tidak yakin bagaimana membuat ini lebih jelas, tapi saya pikir ini membutuhkan klarifikasi / pegangan tangan. Saya mencoba setiap pintasan yang dapat saya pikirkan dan akhirnya memaksa penurunan versi untuk memperbaiki masalah saya.

Saya menggunakan IPython untuk mempermudah mengetik dan mengedit blok multi-baris di REPL sambil mengajar audiens langsung. Saya menduga orang lain dalam situasi saya mungkin memiliki masalah serupa.

Mungkin ada peringatan di suatu tempat yang menunjukkan bahwa Ctrl-O dapat digunakan untuk membuat blok kode multi-baris? Saya tidak yakin apakah ada tempat yang tepat untuk itu.

Ini adalah bug dengan refactor baru-baru ini, saya hanya mencoba memberi tahu Anda bahwa Anda dapat menggunakan Ctrl-O untuk sementara jika Anda ingin menggunakan 7.x

Ah bagus! Saya senang itu hanya bug. Terima kasih @Carreau! 😄

Maukah Anda memberi saya beberapa contoh (berfungsi dan tidak berhasil) dari apa yang Anda harapkan, untuk memberikan tes untuk perbaikan?

Saya memiliki beberapa tetapi hanya mengumpulkan sedikit dan tidak ingin memengaruhi Anda.

with open('hello.txt', mode='wt') as my_file:
    my_file.write('hi')
    my_file.write('hi again')

Tidak dapat mengingat contoh kedua, tetapi sejumlah loop:

numbers = [2, 1, 3, 4, 7, 8, 11]

for n in numbers:
    if n > 0:
        print(n*2)
    else:
        print(n/2)

@Carreau adalah seseorang yang menangani masalah ini? Saya akan dengan senang hati membantu

hai @ Deborah-Digges, saya telah melihat sekilas tetapi sejauh ini tidak terlalu banyak.

Saya telah menulis kasus uji kecil ini untuk melihat perbedaan antara input_splitter lama dan input_transformer baru:

from IPython.core import inputtransformer2 as ipt2 # new way
from IPython.core import inputsplitter #oldl way

occ =  inputsplitter.InputSplitter().check_complete
cc = ipt2.TransformerManager().check_complete

comp = lambda x : (cc(x), occ(x), x)
print(comp('if'))
print(comp('if\n\n'))
print(comp("""
def foo():
    print('Hello')"""
))
print(comp('if True:'))

Yang mengakibatkan

(('invalid', None), ('invalid', None), 'if')
(('complete', None), ('invalid', None), 'if\n\n')
(('complete', None), ('incomplete', 4), "\ndef foo():\n    print('Hello')")
(('incomplete', 4), ('incomplete', 4), 'if True:')

Anda lihat bahwa item ke-3 adalah yang menarik bagi kami. Yang kedua karena penasaran karena salah satu “fitur” dari IPython adalah melakukan force-execution jika ada lebih dari 2 baris baru.

Bagian dari kode yang relevan ada di shortcut.py:L109-L127 .

Saya kira ada semacam penggabungan antara peran yang menentukan apakah pemeriksaan kode "selesai", atau apakah kita harus "menjalankan atau menambahkan baris baru".

Saya _menebak_ bahwa heuristik yang memeriksa apakah input multiline dan apakah karakter terakhir sudah menjadi baris baru atau tidak sudah cukup.

Salah satu pertanyaan yang tersisa adalah di mana harus memperbaikinya?

  • di shortcut.py ? jika demikian itu hanya akan memperbaiki terminal IPython
  • di input_transformer2? Saya pikir itu mungkin solusi yang tepat karena ini tetapi kemungkinan besar juga akan memengaruhi QtConsole.

Beri tahu saya jika itu cukup untuk setidaknya membantu Anda memulai.

Terima kasih!

Hai @Carau ! Terima kasih banyak atas penjelasan rinci dan kasus uji.

Saya dapat mereproduksinya secara lokal dengan versi dev ipython dan sekarang akan mulai melihat kode untuk shortcut.py dan inputtransformer .

Maukah Anda memberi saya beberapa contoh (berfungsi dan tidak berhasil) dari apa yang Anda harapkan, untuk memberikan tes untuk perbaikan?

Anda tidak membutuhkan beberapa contoh. Bug terjadi dengan cara yang sangat dapat direproduksi.
Multiline hanya berfungsi jika garis diakhiri dengan titik dua. Jika tidak ada titik dua di akhir baris maka iPython menjalankan kode. Ini terlihat sedikit lebih sepele dengan informasi ini tetapi tidak pernah melihat kode sumber iPython, jadi mungkin saya sedikit terlalu optimis di sini;)

iPython

Saya mohon huruf besar, kami tidak ingin masalah dengan apel.

Anda tidak membutuhkan beberapa contoh

Ya, saya tidak _need_, tapi saya ingin banyak contoh. Saya dapat mereproduksi dan memiliki gagasan tentang cara memperbaikinya, tetapi memiliki beberapa kasing membantu saya memastikan bahwa saya tidak mengenai kasus tepi. Saya memiliki pandangan yang bias tentang bagaimana menggunakan IPython, jadi contoh dari yang lain sangat membantu.

iPython
Saya mohon huruf besar, kami tidak ingin masalah dengan apel.

Setidaknya saya menemukan mengapa ada huruf I atas di nama, terima kasih dan maaf :)

Sebagai permintaan maaf, berikut ini permintaan tarik # 11354 yang memperbaiki masalah (utama) ini. IMHO ini adalah bug pemblokiran untuk IPython, Anda harus mempertimbangkan untuk segera merilis (lihat berapa banyak masalah yang dibuat di github oleh pengguna terkait hal itu).

Setidaknya saya menemukan mengapa ada huruf I atas di nama, terima kasih dan maaf :)

Itu bukan satu-satunya alasan, karena IPython 0.1 dirilis sebelum iProduct pertama, tetapi biasanya orang ingat

Sebagai permintaan maaf, berikut ini permintaan tarik # 11354 yang memperbaiki masalah (utama) ini.

terima kasih, saya akan melihat jika waktu memungkinkan

Anda harus mempertimbangkan untuk segera merilisnya

Ya, begitu seorang sukarelawan punya waktu, kami akan melakukannya. Ada masalah kritis lainnya seperti mengeluarkan jupyter_console, dan saya rasa tidak ada orang di sini yang dapat mengambil beberapa jam di $ DAYJOB untuk melakukannya. Jadi mungkin harus menunggu akhir minggu ini.

Sebenarnya, saya mendapat regresi dengan perbaikan saya. Perbaiki sekarang.

Sebenarnya, saya mendapat regresi dengan perbaikan saya. Perbaiki sekarang.

PR # 11354 diperbarui sekarang.

Terima kasih atas perbaikannya, ada ide kapan ini akan dirilis? Saya menggunakan vim keybindings ke CTRL-O tidak berfungsi untuk saya (ESC + o tidak ...)

Terima kasih atas perbaikannya, ada ide kapan ini akan dirilis?

Itu akan menjadi salah satu sukarelawan di proyek mendapatkan beberapa jam gratis untuk memrioritaskan beberapa masalah yang tersisa untuk 7.1 dan melakukan rilis. Saya berharap mungkin memiliki waktu beberapa jam di akhir pekan ini, tetapi itu mungkin tidak cukup.

Bantuan apa pun dalam menentukan prioritas / meninjau / menandai PR / Masalah yang ada akan sangat membantu.

Masih dapat direproduksi dengan blok async with , mencoba cabang master saat ini dan v7.1.1 dari PyPI.

In [16]: async with aiofiles.open('/tmp/foobar', 'r') as f:
    ...:     content = await f.read()

In [17]: content
Out[17]: 'hello'

Hum, itu mungkin interaksi yang aneh dengan autoawait.

Oh, saya tidak berpikir itu akan terkait dengan masalah ini. Bagaimanapun, alasan gagal adalah ketika kita punya

async with aiohttp.ClientSession() as session:
    pass|   # < cursor is there

menjalankan check_complete pada setiap akhir baris, yang, pada gilirannya, mengeksekusi compile_command , dan yang terakhir menghasilkan SyntaxError karena 'async with' digunakan di luar fungsi async .
Di garpu saya, saya baru saja mematikan SyntaxError tetapi tentu saja itu bukan cara terbaik untuk memperbaikinya, lol.

Solusi / ide yang mungkin:

  • harus memeriksa apakah autoawait dihidupkan. jika ya, abaikan kasus SyntaxError spesifik itu. Menurut saya ini bukan solusi yang baik, tapi mungkin saya juga membuat hal-hal yang terlalu rumit.

  • jika autoawait aktif, beri makan compile_command() dengan kode yang dibungkus dengan _asyncify() . saya kira, cara ini tidak akan menghasilkan SyntaxError , tetapi saya tidak yakin apakah masalah baris baru akan diselesaikan karena _asyncify() itu sendiri menambahkan beberapa tingkat lekukan dan dengan mudah bisa menjadi berantakan.

  • mungkin _AsyncSyntaxErrorVisitor bisa membantu? Tapi saya kira itu untuk sebaliknya

Saya minta maaf atas kurangnya dedikasi, saya akan mengirimkan PR, tapi saya benci menulis tes dan yang lainnya dan juga tidak yakin cara yang lebih baik untuk memperbaikinya. Tapi saya harap ini masih berguna untuk seseorang.

Kita bisa mencoba sesuatu seperti ini juga.

Itu maksud Anda nº 2, dan itu memang jelek. Baris baru berfungsi. Apa yang baik adalah mendapatkan dukungan yang tepat di CPython.

Apakah masalah ini masih belum terselesaikan? Saya pikir saya mungkin telah menangkap bug ini ...

Ini muncul hari ini untuk pertama kalinya (selama demo dengan klien ketika saya mencoba menunjukkan apa itu generator dengan Python !!!).

Apakah saya melakukan sesuatu yang salah atau apa yang harus saya lakukan untuk menulis blok kode multi-baris (selain solusi CTRL-o)?

Hasil yang diharapkan seperti yang ditunjukkan dalam REPL Python standar:

(tsa) BillsMacBookPro:develop billtubbs$ python
Python 3.5.5 | packaged by conda-forge | (default, Jul 23 2018, 23:45:11) 
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in range(5):
...     x = i*2
...     print(x)
... 
0
2
4
6
8
>>> exit()

Hasil hari ini ketika saya mengetik yang sama ke dalam REPL iPython:

(tsa) BillsMacBookPro:develop billtubbs$ ipython
Python 3.5.5 | packaged by conda-forge | (default, Jul 23 2018, 23:45:11) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: for i in range(5): 
   ...:     x = i*2                                                                   

In [2]:      

IPython REPL secara otomatis mengindentasi baris kedua seperti yang diharapkan. Tetapi ketika saya mengetik enter di akhir baris kedua, ia mengeksekusi dua baris alih-alih menyediakan baris ketiga opsional.

Seperti dijelaskan di atas, saya bisa mendapatkan hasil yang diinginkan dengan menekan CTRL-o daripada menekan enter pada baris kedua:

In [2]: for i in range(5): 
   ...:     x = i*2 
   ...:     print(x)                                                                  
0
2
4
6
8

IPython 7.0.1 - ...

Silakan tingkatkan IPython Anda, masalah ini teratasi, masih ada kasus tepi dengan kode async.

Oh maaf. Aku pikir aku melakukannya. Setelah conda update ipython saya mendapatkan # All requested packages already installed.

Maaf, saya agak bingung. Apa versi terbaru dan bagaimana cara meningkatkannya?

Itu akan tergantung pada bagaimana Anda menginstalnya, saya akan menyarankan untuk mencoba dengan pip install untuk melihat apakah ini berfungsi. Tetapi Anda mungkin juga bekerja di lingkungan.

Ketika hal-hal seperti itu terjadi, saya mencoba untuk menghapus instalasi secara agresif sampai saya tidak dapat meluncurkan IPython dan kemudian menginstal ulang.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat