Bagaimana cara menggunakan pernyataan lulus?

392

Saya sedang dalam proses belajar Python dan saya telah mencapai bagian tentang passpernyataan itu. Panduan yang saya gunakan mendefinisikannya sebagai Nullpernyataan yang biasa digunakan sebagai pengganti.

Saya masih belum sepenuhnya mengerti apa artinya itu. Dapatkah seseorang menunjukkan kepada saya situasi sederhana / dasar di mana passpernyataan itu akan digunakan dan mengapa itu diperlukan?

Capurnicus
sumber
4
Saya tidak pernah perlu melakukan ini dalam kehidupan nyata, tetapi saya bisa mengira passakan berguna ketika Anda ingin mengganti metode dalam subkelas untuk tidak melakukan apa pun.
kojiro
2
@kojiro misalnya kadang-kadang berguna ketika melakukan en.wikipedia.org/wiki/Skeleton_(computer_programming)
Franck Dernoncourt
1
Sangat berguna saat memproses pengecualian. Terkadang pengecualian berarti kondisi normal yang hanya membutuhkan jenis pemrosesan yang berbeda. Dalam hal ini pass, exceptblok sangat berguna.
Fisikawan Gila

Jawaban:

475

Misalkan Anda sedang merancang kelas baru dengan beberapa metode yang belum ingin Anda terapkan, belum.

class MyClass(object):
    def meth_a(self):
        pass

    def meth_b(self):
        print "I'm meth_b"

Jika Anda meninggalkan passkode, kode tidak akan berjalan.

Anda kemudian akan mendapatkan:

IndentationError: expected an indented block

Untuk meringkas, passpernyataan itu tidak melakukan hal tertentu, tetapi dapat bertindak sebagai pengganti, seperti yang ditunjukkan di sini.

sebastian_oe
sumber
22
Nah, dalam hal ini orang juga bisa menggunakan return, meskipun dengan sedikit kehilangan kejelasan.
38
Saya benar-benar tidak berpikir ini menjawab pertanyaan dengan benar. Mengutip satu penggunaan yang mungkin untuk sesuatu, bahkan jika itu adalah penggunaan yang paling umum untuk itu, tidak sama dengan menjelaskan untuk apa itu.
Schilcote
5
@Schilcote: Saya mengerti maksud Anda. Saya menambahkan penjelasan singkat lain pada jawaban awal saya. Namun, saya berpikir bahwa contoh sederhana sering membantu untuk memahami konsep tertentu.
sebastian_oe
3
Jawaban oleh @Anaphory, di bawah, menunjukkan mengapa ini adalah elemen bahasa yang penting.
John
2
Ini menjelaskan satu penggunaan pass, tapi saya masih tidak begitu mengerti apa fungsinya. Apakah ada gunanya untuk ini dalam kode produksi? Dari contoh Anda, saya akan memilih untuk tidak menambahkan metode itu sampai saya siap untuk mengimplementasikannya, atau saya hanya akan melakukannya return.
theUtherSide
221

Python memiliki persyaratan sintaksis yang blok kode (setelah if, except, def, classdll) tidak bisa menjadi kosong. Namun blok kode kosong berguna dalam berbagai konteks yang berbeda, seperti dalam contoh di bawah ini, yang merupakan kasus penggunaan yang paling sering saya lihat.

Oleh karena itu, jika tidak ada yang seharusnya terjadi dalam blok kode, a passdiperlukan agar blok tersebut tidak menghasilkan IndentationError. Atau, pernyataan apa pun (termasuk hanya istilah yang akan dievaluasi, seperti Ellipsisliteral ...atau string, paling sering merupakan docstring) dapat digunakan, tetapi passmemperjelas bahwa memang tidak ada yang seharusnya terjadi, dan tidak perlu benar-benar dievaluasi dan (setidaknya sementara) disimpan dalam memori.

  • Mengabaikan (semua atau) jenis tertentu Exception(contoh dari xml):

    try:
        self.version = "Expat %d.%d.%d" % expat.version_info
    except AttributeError:
        pass # unknown

    Catatan: Mengabaikan semua jenis kenaikan gaji, seperti dalam contoh berikut dari pandas, umumnya dianggap praktik buruk, karena juga menangkap pengecualian yang mungkin harus diteruskan ke penelepon, misalnya KeyboardInterruptatau SystemExit(atau bahkan HardwareIsOnFireError- Bagaimana Anda tahu Anda tidak berjalan pada kotak khusus dengan kesalahan spesifik yang ditentukan, yang ingin diketahui beberapa aplikasi panggilan?).

    try:
        os.unlink(filename_larry)
    except:
        pass

    Alih-alih menggunakan setidaknya except Error:atau dalam hal ini lebih disukai except OSError:dianggap praktik yang jauh lebih baik. Analisis cepat semua modul python yang saya pasang memberi saya bahwa lebih dari 10% dari semua except ...: passpernyataan menangkap semua pengecualian, jadi ini masih merupakan pola yang sering terjadi dalam pemrograman python.

  • Turunkan kelas pengecualian yang tidak menambahkan perilaku baru (misalnya dalam scipy):

    class CompileError(Exception):
        pass

    Demikian pula, kelas yang dimaksudkan sebagai kelas dasar abstrak sering memiliki metode kosong __init__atau metode eksplisit lain yang seharusnya diturunkan. (mis. pebl)

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
  • Menguji kode tersebut berjalan dengan benar untuk beberapa nilai pengujian, tanpa memedulikan hasil (dari mpmath):

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
  • Dalam definisi kelas atau fungsi, seringkali docstring sudah ada sebagai pernyataan wajib untuk dieksekusi sebagai satu-satunya hal dalam blok. Dalam kasus seperti itu, blok dapat berisi pass selain docstring untuk mengatakan "Ini memang dimaksudkan untuk tidak melakukan apa pun.", Misalnya dalam pebl:

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
  • Dalam beberapa kasus, passdigunakan sebagai pengganti untuk mengatakan "Metode / kelas / jika-blok / ini ... belum dilaksanakan, tetapi ini akan menjadi tempat untuk melakukannya", meskipun saya pribadi lebih suka yang Ellipsisliteral ...untuk benar-benar membedakan antara ini dan "no-op" yang disengaja dalam contoh sebelumnya. ( Perhatikan bahwa literal Ellipsis adalah ekspresi yang valid hanya dengan Python 3 )
    Sebagai contoh, jika saya menulis model dengan sapuan lebar, saya mungkin menulis

    def update_agent(agent):
        ... 

    di mana orang lain mungkin memiliki

    def update_agent(agent):
        pass

    sebelum

    def time_step(agents):
        for agent in agents:
            update_agent(agent)

    sebagai pengingat untuk mengisi update_agentfungsi di kemudian hari, tetapi jalankan beberapa tes untuk melihat apakah sisa kode berperilaku sebagaimana dimaksud. (Opsi ketiga untuk kasus ini adalah raise NotImplementedError. Ini berguna khususnya untuk dua kasus: Baik “Metode abstrak ini harus diimplementasikan oleh setiap subkelas, tidak ada cara umum untuk mendefinisikannya dalam kelas dasar ini” , atau “Fungsi ini, dengan nama ini, belum diimplementasikan dalam rilis ini, tetapi ini akan terlihat seperti apa tanda tangannya ” )

Anaforis
sumber
Ini jawaban yang jauh lebih baik!
rjoxford
22

Selain penggunaannya sebagai pengganti untuk fungsi yang tidak diterapkan, passdapat berguna dalam mengisi pernyataan if-else ("Eksplisit lebih baik daripada implisit.")

def some_silly_transform(n):
    # Even numbers should be divided by 2
    if n % 2 == 0:
        n /= 2
        flag = True
    # Negative odd numbers should return their absolute value
    elif n < 0:
        n = -n
        flag = True
    # Otherwise, number should remain unchanged
    else:
        pass

Tentu saja, dalam hal ini, seseorang mungkin akan menggunakan returnalih-alih penugasan, tetapi dalam kasus di mana mutasi diinginkan, ini berfungsi paling baik.

Penggunaan di passsini sangat berguna untuk memperingatkan pengelola masa depan (termasuk Anda sendiri!) Untuk tidak menempatkan langkah-langkah yang berlebihan di luar pernyataan bersyarat. Pada contoh di atas, flagdiatur dalam dua kasus yang disebutkan secara khusus, tetapi tidak di else-case. Tanpa menggunakan pass, programmer masa depan mungkin pindah flag = Trueke luar kondisi — dengan demikian pengaturan flagdalam semua kasus.


Lain halnya dengan fungsi boilerplate yang sering terlihat di bagian bawah file:

if __name__ == "__main__":
    pass

Dalam beberapa file, mungkin lebih baik meninggalkannya di sana passuntuk memungkinkan pengeditan lebih mudah nanti, dan untuk membuat eksplisit bahwa tidak ada yang diharapkan terjadi ketika file dijalankan sendiri.


Akhirnya, seperti yang disebutkan dalam jawaban lain, bisa bermanfaat untuk tidak melakukan apa pun ketika ada pengecualian yang tertangkap:

try:
    n[i] = 0
except IndexError:
    pass
Micah Walter
sumber
2
Saya pikir dua contoh pertama umumnya merupakan praktik buruk. Mengenai contoh pertama, Anda harus mengatur flag = Falsesebelum if ... elif blok untuk mencegah kesalahan "NameError: name 'flag' tidak didefinisikan" di kemudian hari. Mengenai contoh kedua, sepertinya bizzar harus menambahkan if __name__ == "__main__": passsebagian besar file Python yang tidak melakukan anythng ketika dieksekusi langsung (yang merupakan kasus ketika Anda menulis kode modular). Dengan Python> = 3.0, Anda harus menggunakan ...(Ellipsis) alih-alih passmenunjukkan blok "selesai nanti".
ostrokach
18

Cara terbaik dan paling akurat untuk dipikirkan passadalah sebagai cara untuk secara eksplisit memberitahu juru bahasa untuk tidak melakukan apa pun. Dengan cara yang sama kode berikut:

def foo(x,y):
    return x+y

berarti "jika saya memanggil fungsi foo (x, y), jumlahkan dua angka yang diwakili label x dan y dan kembalikan hasilnya",

def bar():
    pass

berarti "Jika saya memanggil bilah fungsi (), jangan lakukan apa pun."

Jawaban lainnya cukup benar, tetapi juga berguna untuk beberapa hal yang tidak melibatkan penahanan tempat.

Sebagai contoh, dalam sedikit kode yang saya kerjakan baru-baru ini, perlu membagi dua variabel, dan mungkin pembagi menjadi nol.

c = a / b

akan, jelas, menghasilkan ZeroDivisionError jika b adalah nol. Dalam situasi khusus ini, meninggalkan c sebagai nol adalah perilaku yang diinginkan dalam kasus b adalah nol, jadi saya menggunakan kode berikut:

try:
    c = a / b
except ZeroDivisionError:
    pass

Lain, penggunaan kurang standar adalah sebagai tempat yang berguna untuk meletakkan breakpoint untuk debugger Anda. Sebagai contoh, saya ingin sedikit kode untuk masuk ke debugger pada iterasi ke-20 dari ... dalam pernyataan. Begitu:

for t in range(25):
    do_a_thing(t)
    if t == 20:
        pass

dengan breakpoint on pass.

Schilcote
sumber
def bar(): passtidak melakukan "sama sekali tidak ada". Itu masih kembali None, secara implisit.
chepner
1
Maksud Anda tentang debugger sering diabaikan tetapi yang penting. +1
Wtower
10

Kasus penggunaan umum di mana ia dapat digunakan 'apa adanya' adalah menimpa kelas hanya untuk membuat tipe (yang sebaliknya sama dengan superclass), misalnya

class Error(Exception):
    pass

Jadi Anda bisa menaikkan dan menangkap Errorpengecualian. Yang penting di sini adalah jenis pengecualian, bukan kontennya.


sumber
6

passpada Python pada dasarnya tidak melakukan apa-apa, tetapi tidak seperti komentar itu tidak diabaikan oleh penerjemah. Jadi Anda bisa memanfaatkannya di banyak tempat dengan menjadikannya tempat penampung:

1: Dapat digunakan di kelas

   class TestClass: 
      pass

2: Dapat digunakan dalam pernyataan loop dan kondisional:

   if (something == true):  # used in conditional statement
       pass

   while (some condition is true):  # user is not sure about the body of the loop
       pass

3: Dapat digunakan dalam fungsi:

   def testFunction(args): # programmer wants to implement the body of the function later
       pass

passsebagian besar digunakan ketika programmer tidak ingin memberikan implementasi saat ini tetapi masih ingin membuat kelas / fungsi / pernyataan kondisional tertentu yang dapat digunakan nanti. Karena interpreter Python tidak memungkinkan untuk pernyataan class / function / conditional kosong atau tidak diimplementasikan, ia memberikan kesalahan:

IndentationError: diharapkan blok indentasi

pass dapat digunakan dalam skenario seperti itu.

Arijit
sumber
5

Anda dapat mengatakan bahwa operan berarti operasi NOP (Tanpa Operasi). Anda akan mendapatkan gambar yang jelas setelah contoh ini: -

Program C

#include<stdio.h>

void main()
{
    int age = 12;

    if( age < 18 )
    {
         printf("You are not adult, so you can't do that task ");
    }
    else if( age >= 18 && age < 60)
    {
        // I will add more code later inside it 
    }
    else
    {
         printf("You are too old to do anything , sorry ");
    }
}

Sekarang bagaimana Anda akan menulis itu dengan Python: -

age = 12

if age < 18:

    print "You are not adult, so you can't do that task"

elif age >= 18 and age < 60:

else:

    print "You are too old to do anything , sorry "

Tetapi kode Anda akan memberikan kesalahan karena diperlukan blok berlekuk setelah elif . Inilah peran kata kunci pass .

age = 12

if age < 18:

    print "You are not adult, so you can't do that task"

elif age >= 18 and age < 60:

    pass

else:

    print "You are too old to do anything , sorry "

Sekarang saya pikir itu jelas bagi Anda.

Deepak Dixit
sumber
1
&&Operator tidak ada di Python
Iván C.
5

Saya suka menggunakannya saat mematikan tes. Saya sering kali menyadari apa yang ingin saya uji tetapi tidak cukup tahu bagaimana melakukannya. Contoh pengujian seperti apa yang disarankan sebastian_oe

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass
dm03514
sumber
Saya sangat menyarankan TIDAK untuk melakukan ini, Anda dapat dengan mudah melupakan tes kosong seperti itu! lebih baik untuk mematikan tes dengan kode pendek selalu gagal misalnya assert Falseatau assert 0dengan cara ini Anda akan selalu dicatat Anda harus menambahkan implementasi :)
jave.web
4

Pernyataan lulus tidak melakukan apa pun. Ini dapat digunakan ketika pernyataan diperlukan secara sintaksis tetapi program tidak memerlukan tindakan.

Harsha Biyani
sumber
4

Jujur, saya pikir dokumen resmi Python menggambarkannya dengan cukup baik dan memberikan beberapa contoh:

The lulus pernyataan tidak apa-apa. Ini dapat digunakan ketika pernyataan diperlukan secara sintaksis tetapi program tidak memerlukan tindakan. Sebagai contoh:

>>> while True: ... pass # Busy-wait for keyboard interrupt (Ctrl+C) ...

Ini biasanya digunakan untuk membuat kelas minimal:

>>> class MyEmptyClass: ... pass ...

Place pass lain dapat digunakan adalah sebagai place-holder untuk fungsi atau badan bersyarat saat Anda bekerja pada kode baru, memungkinkan Anda untuk terus berpikir pada tingkat yang lebih abstrak. The lulus diam-diam diabaikan:

>>> def initlog(*args): ... pass # Remember to implement this! ...

Usagi
sumber
0

seperti kata buku itu, saya hanya pernah menggunakannya sebagai pengganti sementara, yaitu,

# code that does something to to a variable, var
if var == 2000:
    pass
else:
    var += 1

dan kemudian mengisi skenario di mana var == 2000

Cameron Sparr
sumber
3
buku apa yang kamu bicarakan?
maaf ... panduan, bahwa OP menyebutkan
Cameron Sparr
0

Pass mengacu pada diabaikan .... sesederhana itu .... jika kondisi yang diberikan benar dan pernyataan berikutnya dilewati, mengabaikan nilai atau iterasi tersebut dan melanjutkan ke baris berikutnya ..... Contoh

For i in range (1,100):
    If i%2==0:
                  Pass 
    Else:
                  Print(i)

Output: Mencetak semua angka ganjil dari 1-100

Ini karena modulus bilangan genap sama dengan nol, maka ia mengabaikan bilangan dan melanjutkan ke bilangan berikutnya, karena modulus bilangan ganjil tidak sama dengan nol. Bagian lain dari loop dieksekusi dan dicetak

Bilas
sumber
Saya mendapatkan SyntaxError. Juga, ini bukan penggunaan yang baik passkarena Anda bisa melakukannyafor i in range(1,100):print(i)if i%2else""
MilkyWay90
-1

Berikut adalah contoh di mana saya mengekstraksi data tertentu dari daftar di mana saya memiliki beberapa tipe data (itulah yang saya sebut di R-- maaf jika itu tata nama yang salah) dan saya ingin mengekstrak hanya data integer / numerik dan BUKAN karakter. .

Data tampak seperti:

>>> a = ['1', 'env', '2', 'gag', '1.234', 'nef']
>>> data = []
>>> type(a)
<class 'list'>
>>> type(a[1])
<class 'str'>
>>> type(a[0])
<class 'str'>

Saya ingin menghapus semua karakter alfabet, jadi saya meminta mesin melakukannya dengan mengatur ulang data, dan "melewatkan" data alfabet:

a = ['1', 'env', '2', 'gag', '1.234', 'nef']
data = []
for i in range(0, len(a)):
    if a[i].isalpha():
        pass
    else:
        data.append(a[i])
print(data)
['1', '2', '1.234']
Edward Tyler
sumber
-1

Pernyataan lulus dalam Python digunakan ketika pernyataan diperlukan secara sintaksis tetapi Anda tidak ingin perintah atau kode dieksekusi.

Pernyataan lulus adalah operasi nol; tidak ada yang terjadi ketika dijalankan. Pass ini juga berguna di tempat-tempat di mana kode Anda pada akhirnya akan pergi, tetapi belum ditulis (misalnya, di rintisan misalnya):

`Contoh:

#!/usr/bin/python

for letter in 'Python': 
   if letter == 'h':
      pass
      print 'This is pass block'
   print 'Current Letter :', letter

print "Good bye!"

Ini akan menghasilkan hasil sebagai berikut:

Current Letter : P
Current Letter : y
Current Letter : t
This is pass block
Current Letter : h
Current Letter : o
Current Letter : n
Good bye!

Kode sebelumnya tidak menjalankan pernyataan atau kode apa pun jika nilai hurufnya 'h'. Pernyataan pass berguna ketika Anda telah membuat blok kode tetapi tidak lagi diperlukan.

Anda kemudian dapat menghapus pernyataan di dalam blok tetapi membiarkan blok tetap dengan pernyataan lulus sehingga tidak mengganggu bagian lain dari kode.

MKDHEERAJ
sumber
-1

pass digunakan untuk menghindari kesalahan lekukan di python Jika kita mengambil bahasa seperti c, c ++, java mereka memiliki kawat gigi seperti

 if(i==0)
 {}
 else
 {//some code}

Tetapi dalam python digunakan indentasi bukan kawat gigi sehingga untuk menghindari kesalahan seperti itu kami menggunakan pass. Ingat saat Anda sedang bermain kuis dan

 if(dont_know_the_answer)
      pass

Contoh program,

  for letter in 'geeksforgeeks':
        pass
  print 'Last Letter :', letter
Ganesh Chowdhary Sadanala
sumber