Dari sesuatu seperti ini:
print(get_indentation_level())
print(get_indentation_level())
print(get_indentation_level())
Saya ingin mendapatkan sesuatu seperti ini:
1
2
3
Bisakah kode membaca sendiri dengan cara ini?
Yang saya inginkan adalah output dari bagian kode yang lebih bersarang menjadi lebih bersarang. Dengan cara yang sama ini membuat kode lebih mudah dibaca, itu akan membuat output lebih mudah dibaca.
Tentu saja saya bisa mengimplementasikan ini secara manual, menggunakan eg .format()
, tetapi yang ada dalam pikiran saya adalah fungsi cetak kustom yang akan di print(i*' ' + string)
mana i
tingkat indentasi. Ini akan menjadi cara cepat untuk membuat output yang dapat dibaca di terminal saya.
Apakah ada cara yang lebih baik untuk melakukan ini yang menghindari pemformatan manual yang telaten?
python
reflection
metaprogramming
indentation
tokenize
Fab von Bellingshausen
sumber
sumber
get_indentation_level()
statment ke dalam kode Anda. Anda bisa melakukanprint(3)
atau apa pun secara langsung. Apa yang mungkin lebih itneresting adalah tingkat saat ini bersarang di tumpukan panggilan fungsi.depth
parameter secara eksplisit dan menambahkan nilai yang sesuai dengannya saat diperlukan saat Anda meneruskannya ke fungsi lain. Bersarangnya kode Anda kemungkinan tidak akan sesuai dengan lekukan yang Anda inginkan dari output Anda.Jawaban:
Jika Anda ingin lekukan dalam hal tingkat bersarang daripada spasi dan tab, segalanya menjadi rumit. Misalnya, dalam kode berikut:
panggilan untuk
get_nesting_level
sebenarnya bersarang sedalam satu tingkat, meskipun faktanya tidak ada spasi putih pada saluranget_nesting_level
panggilan tersebut. Sementara itu, dalam kode berikut:panggilan untuk
get_nesting_level
bersarang level nol dalam, meskipun ada spasi putih terkemuka di jalurnya.Dalam kode berikut:
dua panggilan untuk
get_nesting_level
berada pada tingkat bersarang yang berbeda, meskipun fakta bahwa spasi putih terkemuka identik.Dalam kode berikut:
apakah itu level nol bersarang, atau satu? Dalam hal
INDENT
danDEDENT
token dalam tata bahasa formal, levelnya nol dalam, tetapi Anda mungkin tidak merasakan hal yang sama.Jika Anda ingin melakukan ini, Anda harus memberi token seluruh file hingga titik panggilan dan menghitung
INDENT
sertaDEDENT
token. Thetokenize
Modul akan sangat berguna untuk fungsi seperti:sumber
get_nesting_level()
dipanggil dalam pemanggilan fungsi ― ia mengembalikan level bersarang dalam fungsi itu. Mungkinkah ditulis ulang untuk mengembalikan tingkat bersarang 'global'?while
danwith
, itu bisa dilakukan, tapi bukan itu yang Anda minta, dan mengubah pertanyaan untuk menanyakan sesuatu yang berbeda pada titik ini akan menjadi ide yang buruk.linecache
modul untuk hal-hal seperti ini - ini digunakan untuk mencetak tracebacks, dan dapat menangani modul yang diimpor dari file zip dan trik impor aneh lainnya)linecache
mungkin baik untuk mengurangi jumlah file I / O (dan terima kasih telah mengingatkan saya tentang hal itu), tetapi jika saya mulai mengoptimalkannya, saya akan terganggu dengan bagaimana kita secara berlebihan melakukan re-tokenizing file yang sama untuk pengulangan file. panggilan yang sama, atau untuk beberapa situs panggilan dalam file yang sama. Ada beberapa cara untuk mengoptimalkannya juga, tetapi saya tidak yakin seberapa besar saya benar-benar ingin menyetel dan tahan terhadap hal gila ini.Ya, itu pasti mungkin, berikut ini contoh kerjanya:
sumber
print('{Space}'*get_indentation_level(), x)
Anda dapat menggunakan
sys.current_frame.f_lineno
untuk mendapatkan nomor baris. Kemudian untuk menemukan jumlah level indentasi, Anda perlu menemukan baris sebelumnya dengan indentasi nol lalu mengurangkan nomor baris saat ini dari nomor baris itu Anda akan mendapatkan jumlah indentasi:Demo:
Jika Anda ingin jumlah level indentasi berdasarkan garis previouse dengan
:
Anda bisa melakukannya dengan sedikit perubahan:Demo:
Dan sebagai jawaban alternatif di sini adalah fungsi untuk mendapatkan jumlah indentasi (spasi putih):
sumber
:
sampai kita menemukan garis dengan lekukan nol, Periksa hasil edit!{3:4, \n 2:get_ind_num()}
Untuk memecahkan masalah "nyata" yang mengarah ke pertanyaan Anda, Anda bisa menerapkan manajer konteks yang melacak tingkat indensi dan membuat
with
struktur blok dalam kode sesuai dengan tingkat indentasi output. Dengan cara ini lekukan kode masih mencerminkan lekukan output tanpa terlalu banyak menyambung. Dimungkinkan untuk memperbaiki kode menjadi fungsi yang berbeda dan memiliki lekukan lain berdasarkan pada struktur kode yang tidak mengacaukan lekukan keluaran.Keluaran:
sumber
sumber