2011-06-03 17 views
8

Estoy escribiendo una aplicación (un contenedor de servidor para Minecraft) que deseo hacer extensible con complementos. Tengo un sistema en funcionamiento que funciona, sin embargo, creo que a la larga podría mejorarse.Implementación de un sistema de complemento en Python

La forma en que la tengo ahora, la aplicación llama a un método "get_plugins" en la clase de servidor que, primero importa un archivo llamado pluginutils.py (pluginutils.py define una clase BasePlugin que muestra todos los complementos), y luego recorre cada archivo .py en el directorio cmds, importándolo y verificando si se trata de una subclase de BasePlugin. Si es así, almacena una instancia de este en un diccionario, para el cual la clave es una cmd variable de clase definida en el complemento. Cada vez que la aplicación recibe un comando del servidor, comprueba si se trata de una clave del diccionario y, si es así, ejecuta el método de inicio de la instancia almacenada en el diccionario, a la que pasa los argumentos necesarios tomados del comando.

Mientras esto funciona, siento que esta es una manera descuidada de hacerlo. ¿Existen mejores técnicas para implementar un sistema similar a este? Quiero escribir esto yo mismo (no quiero usar nada como zope.interface) ya que es una experiencia de aprendizaje. Gracias.

+0

Im curious; ** ¿cómo ** comprueba si el complemento tiene una clase BasePlugin subclasificada? – tMC

+0

@tMC Puede usar Class .__ subclasses __() que devuelve una lista de subclases de la clase (BasePlugin). Los controlo contra esa lista. –

+0

Gracias- No sabía eso; ¡eso será muy útil! – tMC

Respuesta

2

Después de haber escrito bastantes arquitecturas diferentes de plugins en diferentes plataformas e idiomas, diré que está muy bien encaminado con la forma en que se escriben la mayoría de los sistemas de complementos.

Básicamente, lo que se reduce a, es que su servidor y su complemento necesitan tener algún tipo de contrato común para trabajar; en otras palabras, su anfitrión necesita saber lo suficiente sobre su complemento que puede transmitir o compartir los recursos comunes que necesitará el complemento, y el complemento necesita saber lo suficiente sobre el host para interactuar con esos recursos.

Implementar esto usando una clase base y una clase derivada como lo ha hecho es una metodología muy común.

+0

La investigación que he hecho me ha llevado básicamente a lo que estás diciendo. Siento que la implementación, tal como la tengo, es un poco descuidada. –

0

sugeriría a utilizar setuptools, porque los plugins están relacionados con el tiempo a la gestión de la lista sys.path:

http://peak.telecommunity.com/DevCenter/PkgResources

A largo plazo, una solución basada en la distribución/envasado como setuptools siempre sería una opción sólida ya que:

  • tienes que cargar complementos sin conflictos o falta de requisitos Rements,
  • , incluso si los complementos cargados dependen de otras dependencias dinámicas, y
  • , debe mantener actualizada la lista de complementos disponibles a medida que se instalan y eliminan los paquetes.
Cuestiones relacionadas