¿Cómo usar la sentencia pass?

392

Estoy en el proceso de aprender Python y he llegado a la sección sobre la passdeclaración. La guía que estoy usando lo define como una Nulldeclaración que se usa comúnmente como marcador de posición.

Sin embargo, todavía no entiendo completamente lo que eso significa. ¿Alguien puede mostrarme una situación simple / básica donde se passusaría la declaración y por qué es necesaria?

Capurnicus
fuente
44
Nunca he necesitado hacer esto en la vida real, pero podría suponer passque sería útil cuando desea anular un método en una subclase para no hacer nada.
kojiro
2
@kojiro, por ejemplo, a veces útil cuando se hace en.wikipedia.org/wiki/Skeleton_(computer_programming)
Franck Dernoncourt
1
Muy útil al procesar excepciones. A veces, una excepción significa una condición normal que solo requiere un tipo diferente de procesamiento. En ese caso, passel exceptbloque es muy útil.
Físico loco

Respuestas:

475

Supongamos que está diseñando una nueva clase con algunos métodos que aún no desea implementar.

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

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

Si dejaras de lado pass, el código no se ejecutaría.

Entonces obtendrías un:

IndentationError: expected an indented block

Para resumir, la passdeclaración no hace nada en particular, pero puede actuar como un marcador de posición, como se demuestra aquí.

sebastian_oe
fuente
22
Bueno, en este caso también se podría usar return, aunque con una ligera pérdida de claridad.
38
Realmente no creo que esto responda adecuadamente la pregunta. Citar un posible uso para algo, incluso si es el uso más común, no es lo mismo que explicar para qué sirve.
Schilcote
55
@Schilcote: veo tu punto. Agregué otra breve explicación a mi respuesta inicial. Sin embargo, creo que un ejemplo simple a menudo ayuda a comprender un cierto concepto.
sebastian_oe
3
La respuesta de @Anaphory, a continuación, muestra por qué este es un elemento importante del lenguaje.
John
2
Esto explica un uso de pass, pero todavía no entiendo realmente lo que hace. ¿Hay un uso para esto en el código de producción? A partir de su ejemplo, optaría por no agregar ese método hasta que esté listo para implementarlo, o simplemente lo haría return.
theUtherSide
221

Python tiene el requisito de que los bloques de código sintáctico (después de if, except, def, classetc.) no pueden estar vacíos. Sin embargo, los bloques de código vacíos son útiles en una variedad de contextos diferentes, como en los ejemplos a continuación, que son los casos de uso más frecuentes que he visto.

Por lo tanto, si no se supone que suceda nada en un bloque de código, passse necesita a para que dicho bloque no produzca un IndentationError. Alternativamente, se puede usar cualquier declaración (incluyendo solo un término para ser evaluado, como el Ellipsisliteral ...o una cadena, la mayoría de las veces una cadena de documentos), pero passdeja en claro que, de hecho, no se supone que suceda nada, y no necesita ser realmente evaluado y (al menos temporalmente) almacenado en la memoria.

  • Ignorando (todos o) un cierto tipo de Exception(ejemplo de xml):

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

    Nota: Ignorar todos los tipos de aumentos, como en el siguiente ejemplo pandas, generalmente se considera una mala práctica, ya que también detecta excepciones que probablemente deberían transmitirse a la persona que llama, por ejemplo, KeyboardInterrupto SystemExit(o incluso HardwareIsOnFireError- ¿Cómo sabes que no eres? ejecutándose en un cuadro personalizado con errores específicos definidos, que algunas aplicaciones de llamadas querrían saber?

    try:
        os.unlink(filename_larry)
    except:
        pass

    En cambio, usar al menos except Error:o en este caso preferiblemente except OSError:se considera una práctica mucho mejor. Un análisis rápido de todos los módulos de Python que he instalado me dio que más del 10% de todas las except ...: passdeclaraciones capturan todas las excepciones, por lo que sigue siendo un patrón frecuente en la programación de Python.

  • Derivar una clase de excepción que no agrega un nuevo comportamiento (por ejemplo, en scipy):

    class CompileError(Exception):
        pass

    Del mismo modo, las clases destinadas a la clase base abstracta a menudo tienen un vacío explícito __init__u otros métodos que se supone que derivan las subclases. (por ejemplo pebl)

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
  • La prueba de ese código se ejecuta correctamente para algunos valores de prueba, sin preocuparse por los resultados (de mpmath):

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
  • En las definiciones de clase o función, a menudo una cadena de documentación ya está en su lugar como la declaración obligatoria que debe ejecutarse como la única cosa en el bloque. En tales casos, el bloque puede contener pass además de la cadena de documentación para decir "Esto no pretende hacer nada", por ejemplo en pebl:

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
  • En algunos casos, passse usa como marcador de posición para decir "Este método / clase / if-block / ... aún no se ha implementado, pero este será el lugar para hacerlo", aunque personalmente prefiero el Ellipsisliteral ...para diferenciar estrictamente entre esto y la intencional "no-op" en el ejemplo anterior. ( Tenga en cuenta que el literal de puntos suspensivos es una expresión válida solo en Python 3 )
    Por ejemplo, si escribo un modelo a grandes rasgos, podría escribir

    def update_agent(agent):
        ... 

    donde otros podrían tener

    def update_agent(agent):
        pass

    antes de

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

    como un recordatorio para completar la update_agentfunción en un momento posterior, pero ejecute algunas pruebas para ver si el resto del código se comporta como se esperaba. (Una tercera opción para este caso es raise NotImplementedError. Esto es útil en particular para dos casos: "Este método abstracto debe ser implementado por cada subclase, no hay una forma genérica de definirlo en esta clase base" , o "Esta función, con este nombre, aún no está implementado en esta versión, pero así es como se verá su firma " )

Anaphory
fuente
¡Esta es una respuesta mucho mejor!
Rjoxford
22

Además de su uso como marcador de posición para funciones no implementadas, passpuede ser útil para completar una instrucción if-else ("explícito es mejor que implícito").

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

Por supuesto, en este caso, uno probablemente usaría en returnlugar de la asignación, pero en los casos en que se desea la mutación, esto funciona mejor.

El uso de passaquí es especialmente útil para advertir a los futuros mantenedores (¡incluido usted mismo!) De no poner pasos redundantes fuera de las declaraciones condicionales. En el ejemplo anterior, flagse establece en los dos casos mencionados específicamente, pero no en el elsecaso. Sin usar pass, un futuro programador podría moverse flag = Truefuera de la condición, configurando así flagen todos los casos.


Otro caso es con la función repetitiva que a menudo se ve al final de un archivo:

if __name__ == "__main__":
    pass

En algunos archivos, puede ser bueno dejar eso allí passpara permitir una edición más fácil más adelante y hacer explícito que no se espera que suceda nada cuando el archivo se ejecuta por sí solo.


Finalmente, como se menciona en otras respuestas, puede ser útil no hacer nada cuando se detecta una excepción:

try:
    n[i] = 0
except IndexError:
    pass
Micah Walter
fuente
2
Creo que los dos primeros ejemplos son generalmente una mala práctica. Con respecto al primer ejemplo, debe establecer flag = Falseantes del if ... elif bloque para evitar errores oscuros de "NameError: name 'flag' no está definido" más adelante. Con respecto al segundo ejemplo, parece extraño tener que agregar if __name__ == "__main__": passa la mayoría de los archivos Python que no hacen nada cuando se ejecutan directamente (que es el caso cuando está escribiendo código modular). Con Python> = 3.0, debe usar ...(puntos suspensivos) en lugar de passindicar bloques "finalizar más tarde".
ostrokach
18

La mejor y más precisa forma de pensar passes decirle explícitamente al intérprete que no haga nada. Del mismo modo el siguiente código:

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

significa "si llamo a la función foo (x, y), sume los dos números que representan las etiquetas x e y y devuelva el resultado",

def bar():
    pass

significa "Si llamo a la barra de funciones (), no haga absolutamente nada".

Las otras respuestas son bastante correctas, pero también son útiles para algunas cosas que no implican mantener el lugar.

Por ejemplo, en un poco de código en el que trabajé recientemente, era necesario dividir dos variables y era posible que el divisor fuera cero.

c = a / b

Obviamente, producirá un ZeroDivisionError si b es cero. En esta situación particular, dejar c como cero era el comportamiento deseado en el caso de que b fuera cero, así que utilicé el siguiente código:

try:
    c = a / b
except ZeroDivisionError:
    pass

Otro uso menos estándar es un lugar útil para poner un punto de interrupción para su depurador. Por ejemplo, quería un poco de código para entrar en el depurador en la vigésima iteración de una declaración for ... in. Entonces:

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

con el punto de quiebre en el pase.

Schilcote
fuente
def bar(): passno hace "absolutamente nada". Todavía regresa None, implícitamente.
chepner
1
Su punto con respecto al depurador a menudo se pasa por alto, pero es importante. +1
Wtower
10

Un caso de uso común donde se puede usar 'tal cual' es anular una clase solo para crear un tipo (que de otro modo es el mismo que la superclase), por ejemplo

class Error(Exception):
    pass

Para que pueda plantear y atrapar Errorexcepciones. Lo que importa aquí es el tipo de excepción, en lugar del contenido.


fuente
6

passen Python básicamente no hace nada, pero a diferencia de un comentario, el intérprete no lo ignora. Por lo tanto, puede aprovecharlo en muchos lugares al convertirlo en un marcador de posición:

1: se puede usar en clase

   class TestClass: 
      pass

2: Se puede usar en bucles y declaraciones condicionales:

   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: se puede utilizar en la función:

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

passse usa principalmente cuando el programador no quiere dar implementación en este momento, pero aún quiere crear una determinada clase / función / declaración condicional que se pueda usar más adelante. Dado que el intérprete de Python no permite la declaración de clase / función / condicional en blanco o sin implementar, da un error:

Error Tabulación: Se esperaba un bloque tabulado

pass se puede usar en tales escenarios.

Arijit
fuente
5

Puede decir que pasar significa operación NOP (sin operación). Obtendrá una imagen clara después de este ejemplo: -

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

Ahora, cómo escribirás eso en 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 "

Pero su código dará error porque requiere un bloque sangrado después de elif . Aquí está el papel de la palabra clave 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 "

Ahora creo que está claro para ti.

Deepak Dixit
fuente
1
&&operador no existe en Python
Iván C.
5

Me gusta usarlo cuando apago las pruebas. Muchas veces soy consciente de lo que me gustaría probar, pero no sé cómo hacerlo. El ejemplo de prueba se parece a lo que sugirió sebastian_oe

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass
dm03514
fuente
¡Recomiendo encarecidamente NO hacer esto , puede olvidarse fácilmente de esta prueba vacía! es mejor poner pruebas cortas con códigos cortos que siempre fallan, por ejemplo, assert Falseo de assert 0esta manera siempre se te indicará que debes agregar una implementación :)
jave.web
4

La declaración de aprobación no hace nada. Se puede usar cuando se requiere una declaración sintácticamente pero el programa no requiere ninguna acción.

Harsha Biyani
fuente
4

Honestamente, creo que los documentos oficiales de Python lo describen bastante bien y proporcionan algunos ejemplos:

La declaración de aprobación no hace nada. Se puede usar cuando se requiere una declaración sintácticamente pero el programa no requiere ninguna acción. Por ejemplo:

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

Esto se usa comúnmente para crear clases mínimas:

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

Se puede usar otro pase de lugar como un marcador de posición para una función o cuerpo condicional cuando se trabaja en un nuevo código, lo que le permite seguir pensando en un nivel más abstracto. El pase se ignora en silencio:

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

Usagi
fuente
0

como decía el libro, solo lo uso como marcador de posición temporal, es decir,

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

y luego complete el escenario donde var == 2000

Cameron Sparr
fuente
3
de que libro estas hablando
lo siento ... guía, que menciona el OP
Cameron Sparr
0

Pass se refiere a ignorar ... tan simple como es ... si la condición dada es verdadera y la siguiente instrucción es pass, ignora ese valor o iteración y pasa a la siguiente línea ..... Ejemplo

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

Salida: Imprime todos los números impares del 1-100

Esto se debe a que el módulo de número par es igual a cero, por lo tanto, ignora el número y pasa al siguiente número, ya que el módulo de números impares no es igual a cero, la parte Else del bucle se ejecuta y se imprime

Rinish
fuente
Me sale un SyntaxError. Además, este no es un buen uso passporque simplemente podría hacerlofor i in range(1,100):print(i)if i%2else""
MilkyWay90
-1

Aquí hay un ejemplo en el que extraía datos particulares de una lista en la que tenía varios tipos de datos (así es como lo llamaría en R, perdón si es una nomenclatura incorrecta) y quería extraer solo datos enteros / numéricos y NO caracteres. .

Los datos se veían así:

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

Quería eliminar todos los caracteres alfabéticos, así que hice que la máquina lo hiciera subconjustando los datos y "pasando" los datos alfabéticos:

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
fuente
-1

La sentencia pass en Python se usa cuando se requiere una sentencia sintácticamente pero no desea que se ejecute ningún comando o código.

La sentencia pass es una operación nula; No pasa nada cuando se ejecuta. El pase también es útil en lugares donde su código eventualmente irá, pero aún no se ha escrito (por ejemplo, en trozos, por ejemplo):

`Ejemplo:

#!/usr/bin/python

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

print "Good bye!"

Esto producirá el siguiente resultado:

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

El código anterior no ejecuta ninguna instrucción o código si el valor de la letra es 'h'. La declaración de aprobación es útil cuando ha creado un bloque de código pero ya no es necesario.

Luego puede eliminar las declaraciones dentro del bloque pero dejar que el bloque permanezca con una declaración de paso para que no interfiera con otras partes del código.

MKDHEERAJ
fuente
-1

pass se usa para evitar errores de sangría en python Si tomamos lenguajes como c, c ++, java, tienen llaves como

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

Pero en python usaba sangría en lugar de llaves, así que para evitar tales errores usamos pass. Recordaba mientras jugabas un cuestionario y

 if(dont_know_the_answer)
      pass

Programa de ejemplo,

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