¿Cómo usar el pase?

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

Aunque todavía no entiendo completamente lo que eso significa. ¿Puede alguien mostrarme una situación simple / básica en la que se usaría la statement de pass y por qué es necesaria?

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 tuvieras que omitir el pass , el código no se ejecutaría.

Entonces obtendrías un

 IndentationError: expected an indented block 

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

Python tiene el requisito sintáctico de que los bloques de código (después de, if , except , def , class , etc.) 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 ocurra nada en un bloque de código, se necesita un pass para que dicho bloque no produzca un IndentationError . Alternativamente, se puede usar cualquier statement (incluido solo un término para ser evaluado, como el literal de Ellipsis ... o una cadena, más a menudo una cadena de documentación), pero el pass deja claro que, de hecho, no se supone que suceda nada, y no es necesario para ser realmente evaluado y (al menos temporalmente) almacenado en la memoria.

  • Ignorar (todo 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 de 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, KeyboardInterrupt o SystemExit (o incluso HardwareIsOnFireError – ¿Cómo lo sabe? no se está ejecutando en un cuadro personalizado con errores específicos definidos, que alguna aplicación de llamada querría conocer?).

     try: os.unlink(filename_larry) except: pass 

    En su lugar, 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 el hecho de que más del 10% de todos, except ...: pass declaraciones de except ...: pass detectan todas las excepciones, por lo que sigue siendo un patrón frecuente en la progtwigción de python.

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

     class CompileError(Exception): pass 

    De manera similar, las clases destinadas a la clase base abstracta a menudo tienen un __init__ vacío explícito 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 que el código se ejecuta correctamente para unos pocos 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 documentos ya está en su lugar como la statement obligatoria que debe ejecutarse como la única cosa en el bloque. En tales casos, el bloque puede contener un 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, el pass se utiliza como marcador de posición para decir “Este método / class / if-block / … no se ha implementado todavía, pero este será el lugar para hacerlo”, aunque personalmente prefiero el literal de Ellipsis ... para diferenciar estrictamente entre esto y el “no-op” intencional en el ejemplo anterior. 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 función update_agent en un momento posterior, pero ejecute algunas pruebas para ver si el rest 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: o “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 este es el aspecto que tendrá su firma ” )

Además de su uso como marcador de posición para funciones no implementadas, el pass puede ser útil para completar una statement if-else (“Explicit 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, es probable que uno use el return lugar de la asignación, pero en los casos en que se desea la mutación, esto funciona mejor.

El uso de pass aquí es especialmente útil para advertir a los futuros mantenedores (¡incluyéndote a ti mismo) que no pongan pasos redundantes fuera de las declaraciones condicionales. En el ejemplo anterior, el flag se establece en los dos casos mencionados específicamente, pero no en el caso else . Sin usar el pass , un progtwigdor futuro podría mover el flag = True fuera de la condición, estableciendo así el flag en todos los casos.


Otro caso es con la función repetitiva que se ve a menudo en la parte inferior de un archivo:

 if __name__ == "__main__": pass 

En algunos archivos, podría ser bueno dejar eso allí con el pass para permitir una edición más fácil más adelante, y para dejar en claro que no se espera que ocurra nada cuando el archivo se ejecute 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 

La mejor y más precisa manera de pensar en pass es como una forma de decirle explícitamente al intérprete que no haga nada. De la misma manera 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 tags 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 es útil para algunas cosas que no involucran mantener el lugar.

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

 c = a / b 

Obviamente, producirá un error ZeroDivision si B es cero. En esta situación particular, dejar c como cero fue el comportamiento deseado en el caso de que b fuera cero, por lo que utilicé el siguiente código:

 try: c = a / b except ZeroDivisionError: pass 

Otro uso menos estándar es como un lugar práctico 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 20ª iteración de una statement for … in. Asi que:

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

con el punto de quiebre en el pase.

Un caso de uso común donde se puede usar ‘tal como está’ es anular una clase solo para crear un tipo (que de lo contrario es lo mismo que la superclase), por ejemplo

 class Error(Exception): pass 

Para que pueda levantar y atrapar excepciones de Error . Lo que importa aquí es el tipo de excepción, más que el contenido.

Si no sabe lo que va a poner en un bloque de código determinado

 try: int(someuserinput) except ValueError: pass 

Me gusta usarlo cuando aplasto las pruebas también. Muchas veces me doy cuenta de lo que me gustaría probar, pero no sé cómo hacerlo. El ejemplo de prueba se parece a lo que sugiere sebastian_oe

 class TestFunctions(unittest.TestCase): def test_some_feature(self): pass def test_some_other_feature(self): pass 

pass Python básicamente no hace nada, pero a diferencia de un comentario, el intérprete no lo ignora. Así que puedes aprovecharla en muchos lugares al convertirlo en un marcador de posición:

1: se puede utilizar en clase

  class TestClass: pass 

2: Se puede usar en bucle y sentencias 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 

pass se usa principalmente cuando el progtwigdor no quiere dar implementación en este momento, pero aún así desea crear una determinada clase / función / statement condicional que se puede usar más adelante. Dado que el intérprete de Python no permite una statement de clase / función / condicional en blanco o no implementada, da un error:

Error Tabulación: Se esperaba un bloque tabulado

pass puede ser usado en tales escenarios.

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

Progtwig C

 #include 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 requirió un bloque sangrado después de elif . Aquí está el papel de la palabra clave de pase .

 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 me parece claro.

La statement de aprobación no hace nada. Puede utilizarse cuando se requiere una statement sintácticamente, pero el progtwig no requiere ninguna acción.

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

La statement de aprobación no hace nada. Puede utilizarse cuando se requiere una statement sintácticamente, pero el progtwig 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 ...

Otro paso de lugar que se puede usar es como un marcador de posición para una función o cuerpo condicional cuando está trabajando en un nuevo código, lo que le permite seguir pensando a un nivel más abstracto. El pase es ignorado silenciosamente

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

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 rellene el escenario donde var == 2000

Aquí hay un ejemplo en el que estaba extrayendo datos particulares de una lista donde tenía múltiples tipos de datos (así es como lo llamaría en R: disculpe si es la nomenclatura incorrecta) y quería extraer solo números enteros / numéricos y NO datos de caracteres .

Los datos parecían:

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

Quería eliminar todos los caracteres alfabéticos, así que hice que la máquina lo hiciera mediante el subconjunto de los datos y “pasando” sobre 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'] 

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

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

`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 statement o código si el valor de la letra es ‘h’. La statement 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 deje que el bloque permanezca con una instrucción de aprobación para que no interfiera con otras partes del código.

Pasar se refiere a ignorar …. tan simple como es … si la condición dada es verdadera y la siguiente statement es pasada, 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.