2012-04-22 26 views
7

Tengo una función que espera operar en un tipo numérico. Estoy leyendo los números para operar desde un archivo, así que cuando los leo son cadenas, no numéricos. ¿Es mejor hacer que mi función sea tolerante con otros tipos (opción (A) a continuación) o convertir a un valor numérico antes de llamar a la función (opción (B) a continuación)?Python convert style: dentro o fuera de función?

# Option (A) 
def numeric_operation(arg): 
    i = int(arg) 
    # do something numeric with i 

# Option (B) 
def numeric_operation(arg): 
    # expect caller to call numeric_operation(int(arg)) 
    # do something numeric with arg 

Respuesta

6

Si su función espera para operar en los datos numéricos, entonces usted está probablemente mejor fuera de Python que permite organizar una TypeError si no recibe uno y algo va mal. Yo diría, haga la conversión afuera y maneje la excepción.

def numeric_operation(arg): 
    # Do numeric things 

try: 
    numeric_operation("abc") 
except TypeError: 
    print("That was supposed to be numeric.") 
1

Depende mucho de su caso de uso. El nombre de su función sugiere que se trata de una operación matemática estrictamente, en cuyo caso probablemente no tenga sentido aceptar cadenas. Esto es fundamentalmente una cuestión de aproximadamente separation of concerns; si su función hace matemáticas, no debería también hacer la conversión. Entonces, en este caso, aconsejaría convertir primero y pasar solo tipos numéricos a la función.

Pero si esta fuera una función que hiciera muchas E/S, por ejemplo, podría ser perfectamente razonable, incluso preferible, llamar al int en lo que se transmita. Si su función está haciendo un conjunto extraño de transformaciones en sus datos para hacerlo presentable a un usuario final, o para convertir la entrada del usuario, esas transformaciones deben ser encapsuladas y agrupadas tanto como sea posible, de modo que el trabajo que realizan no "sangre" en otras funciones.

5

Yo dividiría estas operaciones. Tenga una función para leer números de un archivo, y permita que esa función devuelva números reales o matrices. Las funciones que realizan las operaciones numéricas no deberían tener que ocuparse de las conversiones cada vez que las llamas, y no deberías tener que implementarlas para cada función. Puede haber excepciones, como una función numérica que acepte números, listas de números y matrices por igual.

Cuando juntas todo, no verás ninguna cadena. ¿Por qué deberías? No hay cadenas reales en el archivo que mencionas. Estos son números codificados como cadenas, así que simplemente léalos en consecuencia y oculte la conversión en la función que importa los datos de su archivo.

1

No haga nada.

Python ya tiene un gran mecanismo de manejo de errores que se lanzará si intenta hacer algo numérico con una cadena, y todo lo que haga ocultará el error que esperaría obtener.

>>> def foo(i): 
...  return i+1 
... 
>>> foo(3) 
4 
>>> foo("hello") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo 
TypeError: Can't convert 'int' object to str implicitly 
+0

No entiendo lo que está tratando de decir. "Cualquier cosa que hagas simplemente ocultará el error". En tu ejemplo, no hacer nada oculta el hecho de que foo no puede manejar cadenas. Si llamo a foo ("hello") lanza pitón "no puedo convertir int a str". Hugh? No te di un int? ¿Qué demonios está mal con esta función? Yo diría que el error ahora está oculto al máximo :) – pwuertz

+0

Mi punto es que su función espera datos numéricos. Algo debería salir mal cuando intente usar una cadena en su lugar, lo que seguramente causará un 'TypeError'. __Eso__ debería ser el error que le pasas al usuario, el del bit que _realmente salió mal_. – katrielalex

Cuestiones relacionadas