¿Cómo usar la declaración de pase?


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

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

 281
Author: martineau, 2012-12-15

13 answers

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

Entonces obtendrías un:

IndentationError: expected an indented block

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

 339
Author: sebastian_oe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 23:58:08

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

  • Ignorando (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, porque también captura excepciones eso probablemente debería ser pasado a la persona que llama, por ejemplo, KeyboardInterrupt o SystemExit (o incluso HardwareIsOnFireError – ¿Cómo sabe que no se está ejecutando en un cuadro personalizado con errores específicos definidos, que alguna aplicación de llamada querría saber?).

    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 que más del 10% de todas las sentencias except ...: pass capturan todas las excepciones, por lo que sigue siendo un patrón frecuente en programación python.

  • Derivando 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 como clase base abstracta a menudo tienen un vacío explícito __init__ u otros métodos que las subclases se supone que derivan. (por ejemplo, pebl)

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
    
  • Probando 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 definiciones de clase o función, a menudo un docstring ya está en su lugar como la instrucción obligatoria para ser ejecutado como la única cosa en el bloque. En tales casos, el bloque puede contener pass además a la docstring para decir "Esto es de hecho la intención de no hacer nada."por ejemplo en pebl:

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
    
  • En algunos casos, pass se 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 Ellipsis literal ... 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

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

    Como recordatorio para completar la función update_agent en un momento posterior, pero ejecute algunas pruebas ya para ver si el resto del código se comporta como se pretende. (Una tercera opción para este caso es raise NotImplementedError. Esto es útil en particular para dos casos: o bien "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á implementada en esta versión, pero así es como se verá su firma")

 158
Author: Anaphory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-11 19:08:59

Además de su uso como marcador de posición para funciones no implementadas, pass puede ser útil para completar una instrucción if-else ("Explicit is better than implicit.")

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, probablemente se usaría return en lugar de asignación, pero en los casos en que se desea una mutación, esto funciona mejor.

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


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

if __name__ == "__main__":
    pass

En algunos archivos, podría ser bueno dejarlo allí con pass para permitir una edición más fácil más adelante, y para hacer explícito que no se espera que nada sucede cuando el archivo se ejecuta por sí solo.


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

try:
    n[i] = 0
except IndexError:
    pass
 19
Author: Micah Walter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-11 18:17:18

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 etiquetas x e y y devuelva el resultado",

def bar():
    pass

Significa "Si llamo a la función bar(), no hago absolutamente nada."

Las otras respuestas son bastante correctas, pero también es útil para algunas cosas que no involucran lugar de retención.

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 fue el comportamiento deseado en el caso de que b fuera cero, así que usé 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. Para por ejemplo, quería un poco de código para entrar en el depurador en la iteración 20 de un for... en declaración. Entonces:

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

Con el punto de interrupción en el pase.

 17
Author: Schilcote,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-12 21:21:38

Un caso de uso común donde se puede usar 'tal cual' 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 puedas subir y coger Error excepciones. Lo que importa aquí es el tipo de excepción, más que el contenido.

 10
Author: Tibo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-14 21:09:06

Si no sabes lo que vas a poner en un determinado bloque de código

try:
   int(someuserinput)
except ValueError:
   pass

Me gusta usarlo cuando rechinan las pruebas también. Muchas veces soy consciente de lo que me gustaría probar, pero no' muy sé cómo hacerlo. Ejemplo de prueba se parece a lo que sebastian_oe sugirió

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass
 6
Author: dm03514,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-14 21:09:14

pass en Python básicamente no hace nada, pero a diferencia de un comentario no es ignorado por el intérprete. Así que usted puede tomar ventaja de ella en un montón de lugares por lo que es un lugar titular:

1: Se puede utilizar en la clase

   class TestClass: 
      pass

2: Se puede usar en instrucciones de bucle y 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 función:

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

pass se utiliza principalmente cuando el programador no quiere dar implementación en este momento, pero todavía quiere crear un cierto clase/función / sentencia condicional que se puede utilizar más adelante. Dado que el intérprete de Python no permite clases/funciones/sentencias condicionales en blanco o sin implementar, da un error:

IndentationError: se espera un bloque indentado

pass se puede utilizar en tales escenarios.

 5
Author: Arijit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-15 05:56:14

Puedes decir que pass significa NOP (Sin Operación) operación. Obtendrá una imagen clara después de este ejemplo :-

C Programa

#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 con sangría después de elif . Aquí está el rol 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.

 4
Author: Deepak Dixit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-12 07:05:46

La instrucción pass no hace nada. Se puede usar cuando se requiere una instrucción sintácticamente, pero el programa no requiere ninguna acción.

 3
Author: Harsha B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-27 13:51:29

Como dice el libro, solo lo uso como un 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

 2
Author: Cameron Sparr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-14 21:05:06

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

La instrucción pass no hace nada. Se puede usar cuando se requiere una instrucció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 ...

Otro lugar pass se puede utilizar como un lugar-holder para una función o condicional cuerpo cuando se está trabajando en nuevo código, lo que le permite seguir pensando en un nivel más abstracto. El paso es silenciosamente ignorado:

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

 2
Author: Usagi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-08 01:42:23

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

Los datos se veían como:

>>> 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 subconjuntando 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']
 0
Author: Edward Tyler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-22 18:35:22

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

La instrucción pass es una operación null; 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 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 instrucción o código si el valor de la letra es 'h'. La instrucción pass es útil cuando ha creado un bloque de código, pero ya no es necesaria.

Luego puede eliminar las instrucciones dentro del bloque, pero dejar que el bloque permanezca con una instrucción pass para que no interfiera con otras partes del código.

 0
Author: M.K.DHEERAJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-10 07:04:57