¿es posible crear nuevos operadores?

Oswaldo Hernández listas en soft-com.es
Dom Sep 21 14:51:29 CEST 2008


Jose Caballero escribió:
 >
...
 > Que no deja de ser una chorrada, pero tiene cierta gracia.
 > Pero no se puede ir más allá de una única opción (o no veo cómo).

Prueba este codigo ;)

< code: xpruebas.comandos.py >

#!/usr/bin/env python
#coding=utf-8

class Opcion:
     def __init__(self, opt):
         self.opt = opt

class Comando:
     def __init__(self, cmd):
         self.__cmd = cmd
         self.opciones = ""

     def __sub__(self, opt):

         # verificacion de opcion
         if not isinstance(opt, Opcion):
             raise TypeError("'%s' no es una opción valida para el comando '%s'" % (opt, self.__cmd))

         opcion = " -%s" % opt.opt

         if "%s " % opcion in self.opciones:
             # el comando esta repetido, ignorar
             return self

         # agregar a lista de opciones
         self.opciones += opcion

         return self

     def __repr__(self):
         # vaciar cache de opciones para la siguiente ejecucion
         opciones = self.opciones
         self.opciones = ""
         return "%s%s" % (self.__cmd, opciones)

</code: xpruebas.comandos.py>

 >>> from xpruebas.comandos import Comando, Opcion
 >>> ls = Comando("ls")
 >>> l = Opcion("l")
 >>> t = Opcion("t")
 >>> r = Opcion("r")
 >>> x = Opcion("x")
 >>> x1 = Opcion("x1")
 >>> x2 = Opcion("x2")
 >>> ls -l
ls -l
 >>>
 >>> ls -r -x2 -x1 -x -t -r -r
ls -r -x2 -x1 -x -t
 >>> ls -5
Traceback (most recent call last):
   File "<input>", line 1, in <module>
   File "x:\Python\xpruebas\comandos.py", line 17, in __sub__
     raise TypeError("'%s' no es una opción valida para el comando '%s'" % (opt, self.__cmd))
TypeError: '5' no es una opción valida para el comando 'ls'

--------

Como ejercicio o entretenimiento no esta mal, pero como aplicacion real lo dudo, ya que tiene varios 
problemas:

. Siempre esta utilizando las mismas instancias de las clases: Con las opciones no es problema, pero 
  los comandos es necesario reiniciarlos, o reinstanciarlos, antes de su aplicacion para vaciar las 
opciones de la ejecución anterior. En el codigo anterior, lo hace en en el __repr__, pero esto es 
solo valido para la demostración.

. Tampoco podriar utilizar opciones numéricas ya que 5=Opcion("5") no es válido.

Saludos,

-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
PD:
Antes de imprimir este mensaje, asegúrese de que es necesario.
El medio ambiente está en nuestra mano.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es