Bagaimanakah Anda Boleh Mengelakkan Ralat Nama Apabila Fungsi Panggilan Ditakrifkan Kemudian dalam Python?

Susan Sarandon
Lepaskan: 2024-10-30 16:04:17
asal
233 orang telah melayarinya

How Can You Avoid NameErrors When Calling Functions Defined Later in Python?

Fungsi Pengisytiharan Ke Hadapan untuk Mencegah Ralat Nama

Menghadapi pengecualian NameError apabila cuba memanggil fungsi yang ditakrifkan kemudian dalam kod boleh mengecewakan. Walaupun susunan definisi Python secara amnya melarang penggunaan fungsi sebelum pengisytiharannya, pengehadan ini boleh dielakkan menggunakan teknik tertentu.

Sebagai contoh, untuk mengisih senarai menggunakan fungsi cmp_configs tersuai yang belum ditakrifkan lagi, Python segera ciri fungsi boleh digunakan:

<code class="python">print("\n".join([str(bla) for bla in sorted(mylist, cmp=cmp_configs)]))

def cmp_configs(x, y):
    ...  # Function implementation</code>
Salin selepas log masuk

Dalam senario ini, panggilan fungsi yang diisih dibalut dalam fungsi yang berasingan, menyelesaikan keperluan segera untuk definisi cmp_configs. Apabila fungsi luar dipanggil, kedua-dua sorted dan cmp_configs akan ditakrifkan, memastikan pelaksanaan yang betul.

Satu lagi situasi biasa yang memerlukan fungsi pengisytiharan hadapan adalah dalam rekursi. Pertimbangkan contoh berikut:

<code class="python">def spam():
    if end_condition():
        return end_result()
    else:
        return eggs()

def eggs():
    if end_condition():
        return end_result()
    else:
        return spam()</code>
Salin selepas log masuk

Apabila menghadapi corak rekursi ini, seseorang mungkin menganggap bahawa mengalihkan definisi telur sebelum spam akan menyelesaikan isu tersebut. Walau bagaimanapun, disebabkan pergantungan bulat antara kedua-dua fungsi, pendekatan ini masih menghasilkan NameError.

Untuk menangani situasi khusus ini, fungsi tersuai boleh diletakkan dalam fungsi telur itu sendiri:

<code class="python">def eggs():
    if end_condition():
        return end_result()
    else:
        def spam():
            if end_condition():
                return end_result()
            else:
                return eggs()
        return spam()  # Explicitly calling the inner 'spam' function</code>
Salin selepas log masuk

Sebagai alternatif, hasil yang sama boleh dicapai menggunakan ungkapan lambda:

<code class="python">def eggs():
    if end_condition():
        return end_result()
    else:
        return lambda: spam()  # Returns a callable object that implements spam</code>
Salin selepas log masuk

Ringkasnya, sementara secara amnya mematuhi prinsip definisi fungsi sebelum penggunaannya, terdapat senario di mana fungsi pengisytiharan hadapan tidak dapat dielakkan . Dengan menggunakan fungsi segera atau ungkapan lambda, pengaturcara boleh memintas pengehadan ini dan mengekalkan struktur kod yang diingini tanpa menjejaskan fungsi.

Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Mengelakkan Ralat Nama Apabila Fungsi Panggilan Ditakrifkan Kemudian dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!