2010-11-14 10 views
5

Tengo una función que se supone que toma una cadena, agrega cosas donde es necesario y devuelve el resultado.¿Cuál es la forma correcta de python para escribir métodos que solo toman un tipo particular?

Mi inclinación natural es simplemente devolver el resultado, que implicó la concatenación de cadenas, y si falló, deje que la excepción flote hasta la persona que llama. Sin embargo, esta función tiene un valor predeterminado, que acabo de devolver sin modificar.

Mi pregunta es: ¿Qué pasa si alguien pasó algo inesperado al método, y devuelve algo que el usuario no espera? El método debería fallar, pero ¿cómo hacer cumplir eso?

Respuesta

5

No es necesario hacerlo, pero si lo desea, puede hacer que su método muestre un TypeError si sabe que el objeto es de un tipo que no puede manejar. Una razón para hacer esto es ayudar a las personas a comprender por qué falla la llamada al método y ayudarlos a solucionarlo, en lugar de darles un error oscuro desde el interior de su función.

Algunos métodos en la biblioteca estándar de hacer esto:

 
>>> [] + 1 
Traceback (most recent call last): 
    File "", line 1, in 
TypeError: can only concatenate list (not "int") to list 
+0

'/ \ breturn \ b/\ raise \ b /'. – delnan

+0

@delnan: ¡Gracias, corregido! –

1

Python funciona bajo el supuesto de que todos somos adultos inteligentes que lea la documentación. Si aún desea hacerlo, no debe valer el tipo real, sino simplemente detectar la excepción cuando el argumento no es compatible con las operaciones que necesita, al igual que:

def foo(arg): 
    try: 
     return arg + "asdf" 
    except TypeError: 
     return arg 
+0

Los catchalls de excepción son malos; es mejor decir 'excepto TypeError' aquí. –

+0

@Russel: Gracias, corregido. –

2

Puede utilizar decoradores para este tipo de cosas, se puede ver un ejemplo here.

Pero forzar parámetros para ser de un tipo específico no es muy pitónico.

0

¿Qué tiene que ver el valor predeterminado? ¿Estás diciendo que quieres devolver el valor predeterminado en el caso en que la persona que llama no pase un str? En ese caso:

def yourFunc(foo): 
    try: 
     return foo + " some stuff" 
    except TypeError: 
     return "default stuff" 

Space_C0wb0y tiene la respuesta correcta si quiere devolver el arg sin modificar si no es una cadena, y también hay la opción de hacer un intento de convertir algo en una cadena:

def yourFunc2(bar): 
    return str(bar) + " some stuff" 

Que funcionará con muchos tipos diferentes.

Cuestiones relacionadas