Foros del Web » Programando para Internet » Python »

Intentando modificar código en tiempo de ejecución en función de la versión de python

Estas en el tema de Intentando modificar código en tiempo de ejecución en función de la versión de python en el foro de Python en Foros del Web. Hola a todos. Tengo que hacer un proyecto en python que sea compatible con la versión 2.7. hasta ahora usaba esta versión pero he llegado ...
  #1 (permalink)  
Antiguo 04/11/2014, 04:37
 
Fecha de Ingreso: febrero-2014
Mensajes: 55
Antigüedad: 7 años, 5 meses
Puntos: 3
Intentando modificar código en tiempo de ejecución en función de la versión de python

Hola a todos.

Tengo que hacer un proyecto en python que sea compatible con la versión 2.7. hasta ahora usaba esta versión pero he llegado a un punto del código en el que me vendría genial poder usar @abstraclassmethod que solo está en la versión 3 en adelante.

Lo que quiero hacer es, dentro del código, tener en una variable la versión del intérprete y, en función de si es mayor o menor que 3, hacer una cosa u otra.

Aquí un fragmento de código:
Código:
#dentro de ModuloA.py

__INTERPRETER_VERSION = float(sys.version.split(" ")[0])
if(__INTERPRETER_VERSION >= 3):
    from abc import abstractclassmethod

class AAA(object):
....
     if(__INTERPRETER_VERSION < 3):
        @classmethod
        def createPacket(cls, bArray, escaped):
            raise NotImplementedError("This method is not implemented in this class. See inheritance.")
    else:
        @abstractclassmethod
        def createPacket(cls, bArray, escaped):
            pass
El problema es que al ejecutar el código me dice que la variable _ModuloA__INTERPRETER_VERSION no está definida. Esto ya se que es por los dos guiones bajos.

Mis preguntas son:
1 - ¿Es buena idea hacer lo que estoy haciendo? ¿pongo simplemente la versión del 2.7 y ya está?

2 - ¿Cómo hago para definir una variable privada dentro del módulo y accederla dentro de las clases de dicho módulo?

Gracias, saludos.

Última edición por SARGE553413; 04/11/2014 a las 05:38
  #2 (permalink)  
Antiguo 07/11/2014, 07:08
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Intentando modificar código en tiempo de ejecución en función de la versió

No creo que sea la mejor forma de hacerlo. Me parece que sería mejor intentar un import dentro de un bloque try, e implementar una "capa de compatibilidad" para python2.7 en un módulo propio:

Código Python:
Ver original
  1. try:
  2.     from abc import abstractclassmethod
  3. except ImportError:
  4.     from mimoduloparapython27 import abstractclassmethod

y luego usas abstractclassmethod normalmente en el código siguiente, que no se ve afectado por la selección de versión. Lo único que tendrías que hacer es definir el decorador abstractclassmethod en tu módulo, y que haga lo que necesites (o lo suficiente para que todo funcione bien)

Con respecto a la segunda pregunta, en Python no existen las variables privadas. Podés evitar que se importe al hacer "from modulo import *" poniéndole un _ delante del nombre (ej. _mivariable), pero no hay manera de hacerla realmente privada como en otros lenguajes (es decir, completamente inaccesible e invisible al mundo exterior). Si importo tu módulo via import:
Código Python:
Ver original
  1. import modulo
siempre podré hacer
Código Python:
Ver original
  1. modulo._variable = loquequiera

y eso vale tanto para tus variables, como para tus clases y funciones de módulo. Es la forma en la que funciona Python. Se pueden implementar algunos niveles de protección, pero depende de cuál sea tu intención al proteger la variable.


Saludos.

Etiquetas: gui, modificar, tiempo, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:58.