Python Try-Except dentro de la función

Tengo una buena comprensión de la cláusula try-except de python, pero tengo problemas al intentar ponerla dentro de una función.

>>> def tryAppend(child, parent): ... try: ... parent.append(child) ... except NameError: ... print "WRONG NAME" >>> var1 = [] >>> var2 = 'test2' >>> tryAppend(var2, var1) #works, no error >>> tryAppend(foo, var1) Traceback (most recent call last): File "", line 1, in  NameError: name 'foo' is not defined 

es casi como que Python no ve la statement try: Cualquier ayuda es apreciada.

Tengo una buena comprensión de la cláusula try-except de python

No. Bueno, tal vez lo haya hecho, pero luego carece gravemente de otras áreas, mucho más importantes. O bien esperas que el scope de try (no pretenda hacerlo) se expanda mágicamente, o no entiendes en qué orden se evalúa el código … asumiré esto último. tryAppend(foo, var1) se evalúa (aproximadamente) en este orden:

  1. Obtener las referencias del objeto tryAppend
  2. Fetch el objeto foo referencias
  3. Fetch las referencias var1 objeto
  4. Llame al primero con el segundo y el tercero como argumentos (= haga lo que haga la función tryAppend , descartando el try-except)

El error ocurre en el # 2, mucho antes de que se ingrese a la función y al bloque try. De hecho, el bloque try no puede lanzar un NameError, ya que los únicos nombres utilizados son parent y child , ambos argumentos y, por lo tanto, siempre disponibles (si .append no existe, es un AttributeError ).

Estas preguntando porque

 raise Exception("Catch me if you can") try: pass # do nothing except: print "caught it" 

no imprime “atrapado”.

Esto no tiene nada que ver con su controlador de excepciones. El error que estás viendo es porque “foo” no está definido en ninguna parte.

El error de nombre está ocurriendo antes de que llegue a tryAppend. Evalúa el valor de foo al intentar pasarlo a la función. Esto funciona:

 def tryAppend(child, parent): parent.append(child) var1 = [] try: tryAppend(foo, var1) except NameError: print 'WRONG NAME' 

El NameError se lanza cuando se evalúa el nombre ‘foo’, que es antes de ingresar a la función. Por lo tanto, el bash / excepto dentro de la función no es relevante.

Para alguien que está buscando cómo usarlo, intente la construcción dentro de la función. No estoy seguro de si es un buen estilo de progtwigción, pero funciona.

Puede poner argumentos de cadena a la función. Se evaluará correctamente y luego podrá usar exec dentro de la función:

 def tryAppend(child, parent): try: script = parent + '.append(' + child + ')' exec script return parent except NameError: print "WRONG NAME" var1 = [] var2 = 'test2' tryAppend('var2', 'var1') tryAppend('foo', 'var1') 

foo excepción foo ocurre incluso antes de ingresar a la función tryAppend() es decir, fuera de la función.