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:
Cree un constructor de objetos
Node
que acepte rawstrings, o una función que convierta cadenas en objetosNode
. Haga que su función asuma que el argumento pasado es un objetoNode
. 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.
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 objetoNode
y llamar amyfunction_node
, omyfunction_node
).Los objetos Make
Node
tienen un método__str__
y dentro de su función, llame astr()
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.
Esta pregunta ya tiene una respuesta aquí:
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