| You are here: Inicio > Inmersión en Python > El poder de la introspección > Todo junto | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
La última línea de código, la única que no hemos desmenuzado todavía, es la que hace todo el trabajo. Pero el trabajo ya es fácil, porque todo lo que necesitamos está dispuesto de la manera en que lo necesitamos. Las fichas de dominó están en su sitio; lo que queda es golpear la primera.
El meollo de apihelper.py:
print "\n".join(["%s %s" %
(method.ljust(spacing),
processFunc(str(getattr(object, method).__doc__)))
for method in methodList])Advierta que esto es una sola orden dividida en varias líneas, pero sin utilizar el carácter de continuación de línea (“\”). ¿Recuerda cuando dije que algunas expresiones pueden dividirse en varias líneas sin usar la barra inversa? Una lista por comprensión es una de estas expresiones, ya que la expresión completa está entre corchetes.
Vamos a tomarlo por el final y recorrerlo hacia atrás. El fragmento
for method in methodList
nos muestra que esto es una lista por comprensión. Como ya sabe, methodList es una lista de todos los métodos que nos interesan de object. De modo que estamos recorriendo esta lista con la variable method.
>>> import odbchelper >>> object = odbchelper>>> method = 'buildConnectionString'
>>> getattr(object, method)
<function buildConnectionString at 010D6D74> >>> print getattr(object, method).__doc__
Crea una cadena de conexión partiendo de un diccionario de parámetros. Devuelve una cadena.
| En la función info, object es el objeto sobre el que pedimos ayuda, pasado como argumento. | |
| Cuando recorremos methodList, method es el nombre del método actual. | |
| Usando la función getattr obtenemos una referencia a la función método del módulo objeto. | |
| Ahora, mostrar la cadena de documentación del método es fácil. |
La siguiente pieza del puzzle es el uso de str con la cadena de documentación. Como recordará usted, str es una función incorporada que convierte datos en cadenas. Pero una cadena de documentación es siempre una cadena luego, ¿por qué molestarse en usar la función str? La respuesta es que no todas las funciones tienen una cadena de documentación, y en este caso su atributo __doc__ es None.
>>> >>> def foo(): print 2 >>> >>> foo() 2 >>> >>> foo.__doc__>>> foo.__doc__ == None
True >>> str(foo.__doc__)
'None'
| En SQL, se utiliza IS NULL en vez de = NULL para comparar un valor nulo. En Python puede usar tanto == None como is None, pero is None es más rápido. | |
Ahora que estamos seguros de tener una cadena podemos pasarla a processFunc, que hemos definido como una función que unifica o no el espacio en blanco. Ahora se ve por qué es importante utilizar str para convertir el valor None en su representación como cadena. processFunc asume que su argumento es una cadena y llama a su método split, y esto fallaría si le pasamos None, ya que None no tiene un método split.
Yendo más atrás, verá que estamos utilizando el formato de cadenas de nuevo para concatenar el valor de retorno de processFunc con el valor de retorno del método ljust de method. Éste es un nuevo método de cadena que no hemos visto antes.
>>> s = 'buildConnectionString' >>> s.ljust(30)'buildConnectionString ' >>> s.ljust(20)
'buildConnectionString'
Casi hemos terminado. Dados el nombre del método ajustado con espacios usando ljust y la cadena de documentación (posiblemente con el espacio blanco unificado) que resultó de la llamada a processFunc, concatenamos las dos y obtenemos una única cadena. Como estamos recorriendo methodList, terminamos con una lista de cadenas. Utilizando el método join de la cadena "\n", unimos esta lista en una única cadena con cada elemento de la lista en una línea diferente, y mostramos el resultado.
Ésta es la última pieza del puzzle. Ya debería entender perfectamente este código.
print "\n".join(["%s %s" %
(method.ljust(spacing),
processFunc(str(getattr(object, method).__doc__)))
for method in methodList])<< Utilización de las funciones lambda |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
Resumen >> |