¿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?
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í.
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 dexml
):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
oSystemExit
(o inclusoHardwareIsOnFireError
– ¿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 preferiblementeexcept 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 sentenciasexcept ...: 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 enpebl
: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 elEllipsis
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 escribirdef 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 esraise 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")
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
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.
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.
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
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.
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.
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.
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
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! ...
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']
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.
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