una script que por pasar parametros parametro opcionales omision lista funciones explicacion espaƱol ejecutar con como argumentos python typechecking

script - que es argv en python



Tipo comprobaciĆ³n de argumentos Python (5)

No, los argumentos de verificación de tipo en Python no son necesarios. Nunca es necesario

Si su código acepta direcciones como raws o como objeto Node , su diseño no funciona.

Eso viene del hecho de que si no sabes ya el tipo de objeto en tu propio programa, entonces ya estás haciendo algo mal.

La verificación de tipo perjudica la reutilización del código y reduce el rendimiento. Tener una función que realiza cosas diferentes según el tipo de objeto pasado es propenso a errores y tiene un comportamiento más difícil de entender y mantener.

Usted tiene las siguientes opciones más sanas:

  1. Cree un constructor de objetos Node que acepte rawstrings, o una función que convierta cadenas en objetos Node . Haga que su función asuma que el argumento pasado es un objeto Node . De esta manera, si necesita pasar una cadena a la función, simplemente lo hace:

    myfunction(Node(some_string))

    Esa es su mejor opción, es limpia, fácil de entender y mantener. Cualquiera que lea el código comprende de inmediato lo que está sucediendo, y no es necesario que compruebe el tipo.

  2. Haga dos funciones, una que acepte objetos Node y otra que acepte rawstrings. Puede hacer una llamada a la otra internamente, de la manera más conveniente ( myfunction_str puede crear un objeto Node y llamar a myfunction_node , o myfunction_node ).

  3. Los objetos Make Node tienen un método __str__ y dentro de su función, llame a str() en el argumento recibido. De esa manera, siempre obtienes una cadena por coacción.

En cualquier caso, no tipee la casilla . Es completamente innecesario y solo tiene inconvenientes. Refactorice su código en su lugar de una manera que no necesite tipear. Solo obtiene beneficios al hacerlo, tanto a corto como a largo plazo.

A veces, es necesario verificar los argumentos en Python. por ejemplo, tengo una función que acepta la dirección de otro nodo en la red como la dirección de cadena sin formato o el nodo de clase que encapsula la información del otro nodo.

Uso el tipo (función 0 como en:

if type(n) == type(Node): do this elif type(n) == type(str) do this

¿Es esta una buena manera de hacer esto?


Parece que buscas una "función genérica", una que se comporte de manera diferente según los argumentos dados. Es un poco parecido a cómo obtendrá una función diferente cuando llama un método en un objeto diferente, pero en lugar de simplemente usar el primer argumento (el objeto / self) para buscar la función, en su lugar utiliza todos los argumentos.

Turbogears usa algo como esto para decidir cómo convertir objetos a JSON, si no recuerdo mal.

Hay un artículo de IBM sobre el uso del paquete de despachador para este tipo de cosas:

De ese artículo:

import dispatch @dispatch.generic() def doIt(foo, other): "Base generic function of ''doIt()''" @doIt.when("isinstance(foo,int) and isinstance(other,str)") def doIt(foo, other): print "foo is an unrestricted int |", foo, other @doIt.when("isinstance(foo,str) and isinstance(other,int)") def doIt(foo, other): print "foo is str, other an int |", foo, other @doIt.when("isinstance(foo,int) and 3<=foo<=17 and isinstance(other,str)") def doIt(foo, other): print "foo is between 3 and 17 |", foo, other @doIt.when("isinstance(foo,int) and 0<=foo<=1000 and isinstance(other,str)") def doIt(foo, other): print "foo is between 0 and 1000 |", foo, other


También puede usar una captura de prueba para verificar si es necesario:

def my_function(this_node): try: # call a method/attribute for the Node object if this_node.address: # more code here pass except AttributeError, e: # either this is not a Node or maybe it''s a string, # so behavior accordingly pass

Puede ver un ejemplo de esto en Beginning Python en el segundo sobre generadores (página 197 en mi edición) y creo en el Python Cookbook . Muchas veces capturar un AttributeError o TypeError es más simple y aparentemente más rápido. Además, puede funcionar mejor de esta manera porque entonces no estás vinculado a un árbol de herencia particular (por ejemplo, tu objeto podría ser un Node o podría ser otro objeto que tenga el mismo comportamiento que un Node ).


Use isinstance() . Muestra:

if isinstance(n, unicode): # do this elif isinstance(n, Node): # do that ...


>>> isinstance(''a'', str) True >>> isinstance(n, Node) True