Pass deyimi nasıl kullanılır?


392

Python'u öğrenme sürecindeyim ve passifade hakkındaki bölüme ulaştım . Kullandığım kılavuz, bunu Nullgenellikle yer tutucu olarak kullanılan bir ifade olarak tanımlar .

Yine de bunun ne anlama geldiğini tam olarak anlamıyorum. Birisi bana passifadenin kullanılacağı ve neden gerekli olduğu basit / temel bir durum gösterebilir mi?


4
Bunu gerçek hayatta hiç yapmak zorunda kalmadım, ancak passhiçbir şey yapmamak için bir alt sınıftaki bir yöntemi geçersiz kılmak istediğinizde yararlı olacağını varsayabilirim .
Kojiro


1
İstisnaları işlerken çok kullanışlı. Bazen bir istisna, sadece farklı türde bir işlem gerektiren normal bir durum anlamına gelir. Bu durumda passiçinde exceptblokta çok kullanışlı oluyor.
Mad Physicist

Yanıtlar:


475

Henüz uygulamak istemediğiniz bazı yöntemlerle yeni bir sınıf tasarladığınızı varsayalım.

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

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

Eğer dışarıda bırakacak passolsaydın, kod çalışmazdı.

Daha sonra şunları elde edersiniz:

IndentationError: expected an indented block

Özetlemek gerekirse, passifade özel bir şey yapmaz, ancak burada gösterildiği gibi bir yer tutucu olarak işlev görebilir.


22
Bu durumda return, hafif bir netlik kaybıyla da kullanılabilir .

38
Bunun soruyu doğru cevapladığını gerçekten sanmıyorum. Bir şey için olası bir kullanımdan bahsetmek, onun için en yaygın kullanım olsa bile, ne için olduğunu açıklamakla aynı şey değildir.
14'te Schilcote

5
@Schilcote: Ne demek istediğini anlıyorum. İlk cevabıma bir kısa açıklama daha ekledim. Bununla birlikte, basit bir örneğin çoğu zaman belirli bir kavramı anlamaya yardımcı olduğunu düşünüyorum.
sebastian_oe

3
@Anaphory tarafından verilen cevap, bunun neden önemli dil öğesi olduğunu göstermektedir.
John

2
Bu bir kullanımını açıklıyor pass, ancak hala ne yaptığını gerçekten anlamıyorum. Bunun üretim kodunda bir kullanımı var mı? Örneğinizden, uygulamaya hazır olana kadar bu yöntemi eklememeyi tercih ederim ya da basitçe yaparım return.
theUtherSide

221

Python sonra kod blokları ki (sözdizimsel şartı vardır if,except , def, classvb) boş olamaz. Bununla birlikte, boş kod blokları, gördüğüm en sık kullanım durumları olan aşağıdaki örneklerde olduğu gibi çeşitli bağlamlarda yararlıdır.

Bu nedenle, bir kod bloğunda hiçbir şey olmaması passgerekiyorsa, böyle bir bloğun an üretmemesi için a gereklidir IndentationError. Alternatif olarak, herhangi bir ifade (sadece bir terim, örneğin bir Ellipsiskelime ...ya da dize, çoğu zaman bir doktora gibi) kullanılabilir, ancak passaslında hiçbir şeyin olmaması ve gerçekte değerlendirilmesi gerekmediği açıktır. (en azından geçici olarak) bellekte saklanır.

  • (Bütün ya da) belirli bir tür göz ardı edilmesi Exception(örnek xml):

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

    Not: Aşağıdaki örnekte olduğu gibi her tür yükseltmeyi görmezden pandasgelmek genellikle kötü uygulama olarak kabul edilir, çünkü muhtemelen arayana iletilmesi gereken istisnaları da yakalar, örneğin KeyboardInterruptveya SystemExit(veya hattaHardwareIsOnFireError - belirli hatalar tanımlı özel bir kutu üzerinde çalışıyorsa, hangi çağrı uygulamalarının bilmek istediği?).

    try:
        os.unlink(filename_larry)
    except:
        pass

    Bunun yerine en azından except Error:veya bu durumda tercihen except OSError:çok daha iyi uygulama olarak kabul edilir. Yüklediğim tüm python modüllerinin hızlı bir analizi bana tüm except ...: passifadelerin % 10'undan fazlasının tüm istisnaları yakaladığını, bu yüzden hala python programlamasında sık görülen bir model olduğunu söyledi.

  • Yeni davranış eklemeyen bir istisna sınıfının türetilmesi (örn. İçinde scipy):

    class CompileError(Exception):
        pass

    Benzer şekilde, soyut temel sınıf olarak düşünülen sınıflar genellikle __init__alt sınıfların türetmesi gereken açık bir boşluğa veya başka yöntemlere sahiptir. (Örneğinpebl )

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
  • Bu kodun test edilmesi, sonuçlardan (kimden mpmath) bağımsız olarak birkaç test değeri için düzgün çalışır :

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
  • Sınıf veya işlev tanımlarında, blokta tek şey olarak uygulanması gereken zorunlu ifade olarak çoğu zaman bir öğreti vardır . Bu gibi durumlarda, blok, "Bu gerçekten hiçbir şey yapmayı amaçlamıyor" demek için doktora pass ek olarak içerebilir .pebl :

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
  • Bazı durumlarda, passben şahsen tercih rağmen söylemek tutucu olarak kullanılan “Bu yöntem / sınıf / eğer blok / ... henüz uygulanmamış olan, ancak bunu yapmak için bir yer olacak” Ellipsisliteral ...için bu ve önceki örnekte kasıtlı “hayır-op” arasında kesin bir ayrım yapın. ( Üç nokta değişmezinin yalnızca Python 3'te geçerli bir ifade olduğunu unutmayın )
    Örneğin, geniş konturlarda bir model yazarsam,

    def update_agent(agent):
        ... 

    başkalarının sahip olabileceği yerler

    def update_agent(agent):
        pass

    önce

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

    update_agentişlevi daha sonra doldurmak için bir hatırlatma olarak , ancak kodun geri kalanının istendiği gibi davranıp davranmadığını görmek için zaten bazı testler yapın. (Bu durum için üçüncü bir seçenek raise NotImplementedError. Bu özellikle iki durum için yararlıdır: Ya “Bu soyut yöntem her alt sınıf tarafından uygulanmalıdır, bu temel sınıfta tanımlamanın genel bir yolu yoktur” veya “Bu işlev, bu ad, henüz bu sürümde uygulanmadı, ancak imzası böyle görünecek ” )


Bu çok daha iyi bir cevap!
rjoxford

22

Uygulanmayan işlevler için yer tutucu olarak kullanılmasının yanı sıra, passif-else ifadesini doldurmada yararlı olabilir ("Açık, örtük olmaktan iyidir.")

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

Tabii ki, bu durumda, muhtemelen returnatama yerine kullanılır , ancak mutasyonun istendiği durumlarda, bu en iyi sonucu verir.

passBurada kullanımı, gelecekteki koruyucuları (kendiniz de dahil!) Koşullu ifadelerin dışına gereksiz adımlar atmamaları konusunda uyarmak için özellikle yararlıdır. Yukarıdaki örnekte, flagözellikle belirtilen iki durumda ayarlanmıştır, ancak else-case'de değil . Kullanarak olmadan pass, gelecekteki bir programcı gidebileceği flag = Truedışarıya koşulunu-böylece ayar flagiçinde tüm durumlarda.


Başka bir durum, genellikle dosyanın alt kısmında görülen kazan plakası işlevidir:

if __name__ == "__main__":
    pass

Bazı dosyalarda, passdaha sonra daha kolay düzenlemeye izin vermek için orada bırakmak ve dosya kendi başına çalıştırıldığında hiçbir şey beklenmeyeceğini açıkça belirtmek güzel olabilir.


Son olarak, diğer cevaplarda belirtildiği gibi, bir istisna yakalandığında hiçbir şey yapmamak yararlı olabilir:

try:
    n[i] = 0
except IndexError:
    pass

2
Bence ilk iki örnek genellikle kötü uygulama. İlk örnekle ilgili olarak, flag = Falsedaha sonra if ... elif "NameError: name 'flag" tanımlı değil "hatalarını önlemek için bloktan önce ayarlamanız gerekir . İkinci örnekle ilgili olarak, if __name__ == "__main__": passdoğrudan yürütüldüğünde herhangi bir şey yapmayan Python dosyalarının çoğuna eklemek zorunda kalıyoruz (modüler kod yazarken durum budur). Python> = 3.0 ile, "sonradan bitir" bloklarını belirtmek ...yerine (Elips) kullanmalısınız pass.
ostrokach

18

Düşünmenin en iyi ve en doğru yolu pass, tercümana hiçbir şey yapmamasını açıkça söylemenin bir yoludur. Aynı şekilde aşağıdaki kod:

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

"foo (x, y) işlevini çağırırsam, x ve y etiketlerinin temsil ettiği iki sayıyı toplayıp sonucu geri veririm",

def bar():
    pass

"İşlev çubuğunu () çağırırsam, kesinlikle hiçbir şey yapma."

Diğer cevaplar oldukça doğrudur, ancak yer tutmayı içermeyen birkaç şey için de yararlıdır.

Örneğin, yakın zamanda üzerinde çalıştığım biraz kodda, iki değişkeni bölmek gerekiyordu ve bölenin sıfır olması mümkün oldu.

c = a / b

Açıkçası, b sıfırsa bir ZeroDivisionError üretir. Bu özel durumda, c sıfır olarak bırakmak b sıfır olması durumunda istenen davranış oldu, bu yüzden aşağıdaki kodu kullandım:

try:
    c = a / b
except ZeroDivisionError:
    pass

Başka bir, daha az standart kullanım, hata ayıklayıcınız için bir kesme noktası koymak için kullanışlı bir yerdir. Örneğin, bir for ... ifadesinde 20. yinelemede hata ayıklayıcısına girmek için biraz kod istedim. Yani:

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

kesme noktası geçişte.


def bar(): pass"kesinlikle hiçbir şey" yapmaz. Hala Nonedolaylı olarak geri dönüyor .
chepner

1
Hata ayıklayıcı ile ilgili noktanız genellikle göz ardı edilir, ancak önemli bir konudur. +1
Wtower

10

'Olduğu gibi' kullanılabileceği yaygın bir kullanım durumu, yalnızca bir tür oluşturmak için (aksi takdirde üst sınıfla aynı olan) bir sınıfı geçersiz kılmaktır;

class Error(Exception):
    pass

Böylece Erroristisnaları artırabilir ve yakalayabilirsiniz . Burada önemli olan içerikten ziyade istisna türüdür.


6

passPython'da temelde hiçbir şey yapmaz, ancak bir yorumdan farklı olarak yorumlayıcı tarafından göz ardı edilmez. Böylece, bir yer tutucu yaparak birçok yerde yararlanabilirsiniz:

1: Sınıfta kullanılabilir

   class TestClass: 
      pass

2: Döngü ve koşullu ifadelerde kullanılabilir:

   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: fonksiyonunda kullanılabilir:

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

passçoğunlukla programcı şu anda uygulama yapmak istemediğinde, ancak daha sonra kullanılabilecek belirli bir sınıf / işlev / koşullu ifade oluşturmak istediğinde kullanılır. Python yorumlayıcısı boş veya eklenmemiş sınıf / işlev / koşullu ifadeye izin vermediğinden, bir hata verir:

Girinti Hatası: girintili bir blok bekleniyor

pass bu tür senaryolarda kullanılabilir.


5

Bunu söyleyebilen geçiş aracı NOP (No Operasyonu) işlemi. Bu örnekten sonra net bir resim elde edeceksiniz: -

C Programı

#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 ");
    }
}

Şimdi bunu Python'da nasıl yazacağınız: -

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 "

Bunun ardından bir girintili blok gerekli çünkü Ancak kodunuz hata verecektir elif . İşte pass anahtar kelimesinin rolü .

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 "

Şimdi sana açık olduğunu düşünüyorum.


1
&&operatörü Python'da mevcut değil
Iván C.

5

Testleri çıkarken kullanmayı seviyorum. Sık sık ne test etmek istediğimin farkındayım ama nasıl yapacağımı bilmiyorum. Test örneği sebastian_oe'nun önerdiği gibi görünüyor

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass

Şiddetle tavsiye bunu yapmak DEĞİL kolayca böyle boş testin unutabilirsiniz! her zaman başarısız kısa kodlarla testleri assert Falseassert 0
saplamak

4

Pass deyimi hiçbir şey yapmaz. Bir deyim sözdizimsel olarak gerektiğinde kullanılabilir, ancak program herhangi bir işlem gerektirmez.


4

Dürüst olmak gerekirse, resmi Python belgelerinin oldukça iyi tanımladığını ve bazı örnekler verdiğini düşünüyorum :

Geçişli deyimi hiçbir şey yapmaz. Bir deyim sözdizimsel olarak gerektiğinde kullanılabilir, ancak program herhangi bir işlem gerektirmez. Örneğin:

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

Bu genellikle minimal sınıflar oluşturmak için kullanılır:

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

Kullanılabilecek başka bir yer geçişi , yeni kod üzerinde çalışırken bir işlev veya koşullu beden için yer tutucu olarak düşünerek daha soyut bir seviyede düşünmenizi sağlar. Pas sessizce göz ardı edilir:

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


0

kitabın dediği gibi, onu sadece geçici bir yer tutucu olarak kullanıyorum, yani,

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

ve daha sonra senaryoyu doldurun. var == 2000


3
hangi kitaptan bahsediyorsun

üzgünüm ... rehber, OP bahsetti
Cameron Sparr

0

Pass, görmezden gelmek anlamına gelir .... olduğu gibi .... verilen koşul doğruysa ve sonraki ifade geçerse, bu değeri veya yinelemeyi yok sayar ve bir sonraki satıra ilerler ..... Örnek

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

Çıktı: 1-100 arasındaki tüm tek sayıları yazdırır

Bunun nedeni, çift sayı modülünün sıfıra eşit olmasıdır, bu nedenle sayıyı yok sayar ve bir sonraki sayıya ilerler, çünkü tek sayı modülü, döngünün Else kısmı yürütülür ve yazdırılır


Anladım SyntaxError. Ayrıca, bu iyi bir kullanım değildir passçünkü sadece yapabilirsinfor i in range(1,100):print(i)if i%2else""
MilkyWay90

-1

Burada, birden fazla veri türüne sahip olduğum bir listeden belirli verileri ayıkladığım bir örnek var (R olarak adlandırdığım şey budur - yanlış adlandırma ise özür dilerim) ve sadece tamsayılar / sayısal ve NOT karakter verilerini ayıklamak istedim .

Veriler şöyle görünüyordu:

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

Tüm alfabetik karakterleri kaldırmak istedim, bu yüzden verileri alt kümeye koyarak ve alfabetik verilerin üzerinden "geçirerek" makineyi yaptım:

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']

-1

Python'daki pass deyimi sözdizimsel olarak bir deyim gerektiğinde kullanılır, ancak herhangi bir komut veya kodun yürütülmesini istemezseniz.

Pass deyimi boş bir işlemdir; hiçbir şey yürütülmediğinde. Geçiş ayrıca kodunuzun en sonunda gideceği ancak henüz yazılmadığı yerlerde de yararlıdır (örneğin, örneğin taslaklarda):

`Örnek:

#!/usr/bin/python

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

print "Good bye!"

Bu aşağıdaki sonucu doğuracaktır:

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

Harf değeri 'h' ise, yukarıdaki kod herhangi bir ifade veya kod yürütmez. Pass deyimi, bir kod bloğu oluşturduğunuzda yardımcı olur, ancak artık gerekli değildir.

Daha sonra blok içindeki ifadeleri kaldırabilir, ancak kodun diğer bölümlerine müdahale etmemesi için bloğun bir pass ifadesiyle kalmasına izin verebilirsiniz.


-1

Python'daki girinti hatasını önlemek için pass kullanılır. c, c ++, java gibi dilleri alırsak,

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

Ancak python'da bu tür hatalardan kaçınmak için parantez yerine girinti kullandı. Bir test oynadığınızı hatırladım ve

 if(dont_know_the_answer)
      pass

Örnek program,

  for letter in 'geeksforgeeks':
        pass
  print 'Last Letter :', letter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.