[[post_data {
    "author" : "KyMAN",
    "since" : 20210719,
    "version" : 20210810
}]]
# Python

El lado Python de AnP no sigue los modelos estándares de Python a la hora de modular un proyecto,
modulándolo a partir de ficheros que luego serán cargados, precompilados y ejecutados a modo de
importación o inclusión dentro del proyecto haciendo que el lado Python pase de ser un entorno
compilable a ser únicamente un entorno precompilable. Dicha filosofía de trabajo se basa en el alto
rendimiento de ejecución de Python con respecto a las necesidades que existen para el uso y
ejecución del AnP, eliminando un proceso que daría mucha rigidez al código así como el sistema de
ficheros <i>[[ignore __init__.py]]</i> para modular los directorios, permitiendo también la
inclusión o importación de elementos y librerías externos al directorio del proyecto AnP. El
problema de los ejecutables se arregla rápidamente con un Script Bash SH en los casos Unix (Linux,
MacOS Android, etc.); o un fichero Batch para los casos DOS (Windows).

Continuando con la filosofía de trabajo de este proyecto, el GUI se basa en un entorno Web en un
navegador cualquiera que posea el OS, aunque también se puede hacer uso de un entorno Core
únicamente para Terminal y COMANDOS y consigo, extender a una ventana, pero está más orientado a una
gestión GUI sobre un navegador Web para gestión de aplicaciones Web.

La filosofía de trabajo de AnP establece que es una clase la cual debe de ser extendida dentro de la
clase del proyecto donde se quiera aplicar, a no ser que éste lo use de librería externa para
compartir entre proyectos u otros detalles pues por cada proyecto donde se extienda se creará un
nuevo AnP.

Finalmente decir que AnP separa los elementos comunes de sus librerías en una librería llamada
AnP.Common, la cual se integra dentro de un nivel de una clase AnP que dejará de existir cuando se
cree la librería principal Anp, pues ésta extiende de sus propios elementos comunes, no siendo los
elementos comunes la librería principal, quedando AnP simplemente para gestionar las librerías y el
arranque del proyecto.

Para conseguir la filosofía de separar los elementos comunes de la gestión global del proyecto AnP
se usa un fichero llamado "include.py" que es el encargado de incluir todas las librerías que se
deseen del propio proyecto. Para poder llevar a cabo dicha tarea a partir de la preconmpilación
podemos trabajar con la creación de dos variables las cuales son:

- **root** *(required)*: Indica el directorio <u>Python</u> del proyecto AnP. Esta variable es
obligatoria pues donde se precompile dicho proyecto será el directorio que se tome como directorio
raiz si no se le especifica. Una opción a tener en cuenta para su tratamiento es que a la par que se
conoce el Path fichero "include.py" del proyecto AnP, se entiende que también se conoce el Path de
dicho directorio, y por lo tanto ha de ser adjunto mediante la creación de dicha variable. Si dicha
variable no se especifica, include.py cogerá como directorio Python el que obtenga a partir del
<i>[[ignore os.path.dirname]]</i> de Python.
- **libraries** *(optional)*: Es un vector, da igual que lista o tupla, donde se le especifican las
librerías a adjuntar. Si no se le especifica dicho vector, include.py cargará todas las librerías
Python del proyecto AnP, sean usadas o no, con su correspondiente aumento de peso tanto en memoria
como en proceso.

Para llevar a cabo dichas tareas se puede seguir el siguiente ejemplo genérico:

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from os.path import dirname as directory_name
from os.path import abspath as path_absolute
from os.path import exists as path_exists

root = directory_name(path_absolute(__file__)) + "/../../../AnP/Python/"
path = root + "include.py"

if path_exists(path):
    with open(path) as data:
        exec(compile(data.read(), "include", "exec"), globals())

class Proyecto(AnP):
    def __init__(self):
        super().__init__()

proyecto = Proyecto()

```

> [[! important IMPORTANTE]]: El proyecto AnP está diseñado para que se puedan usar caracteres, no
solo UTF-7, sino más globalizado, por lo que se aconseja utilizar las cabeceras de Python para UTF-8
como se muestra en el ejemplo.

> [[! important IMPORTANTE]]: Para poder enviar las variables globales contra la precompilación y
ejecución es muy importante establecer las variables globales en la ejecución, como sale en el
ejemplo con el "globals()".

> [[! important IMPORTANTE]]: En el ejemplo se ve como la clase Proyecto extiende de AnP, y en su
constructor hace llamada al constructor de AnP pues si no se construye AnP, muchos elementos de la
carga de AnP estarán incompletos.

Es importante antes de empezar decir que la librería AnP se basa en la distinción de Python 2 y
Python 3 pese a las diferencias que pueda haber entre subversiones, y siempre existirá dicha
distinción si la sintaxis no cambia para versiones futuras, y de ahí que esta librería no sea
compatible con Python 1 por el cambio de sintaxis en métodos globales como "print" y otros.

Y para finalizar la presentación de Python, es importante tener encuenta el diagrama de flujo
interno a la hora de cargar las librerías, el cual es el siguiente:

```mermaid
graph TD
anp[AnP] -->|extends| common[AnP.Common]
anp -->|remove| common
```

> [[! note NOTA]]: AnP usa la referencia en memoria que posee tras haber extendido AnP.Common, de
esta forma se puede eliminar dicha variable o entorno. La eliminación se lleva a cabo puesto que
AnP.Common se crea antes que AnP, creando una clase AnP no funcional; tras ello AnP se carga
copiando la referencia en una variable temporal que usará para extender, luego eliminará la clase
AnP del AnP.Common y se proclama como la clase AnP principal extendiendo AnP.Common a partir de la
variable temporal que se creó.

[[header_level 0]]
[[include /WMD/es/py/run.w.md]]

[[header_level 0]]
[[include /WMD/es/py/AnP.Common.py.w.md]]

[[header_level 0]]
[[include /WMD/es/py/AnP.py.w.md]]

[[header_level 0]]
[[include /WMD/es/py/AnP.Settings.py.w.md]]

[[header_level 0]]
[[include /WMD/es/py/AnP.I18N.py.w.md]]

[[header_level 0]]
[[include /WMD/es/py/AnP.Procedures.w.md]]

[[header_level 0]]
[[include /WMD/es/py/faq.w.md]]

[[html_data {
    "title" : "Documentación - Python",
    "url" : "https://anp.k3y.pw/es/py/",
    "author" : "Tarsier, angelus, inoro, KyMAN",
    "since" : 20210719,
    "version" : 20210810,
    "key_words" : "anp,attach,play,attach&play,documentación,python",
    "description" : "Documentación Python del proyecto AnP.",
    "project" : "AnP",
    "logo" : "https://anp.k3y.pw/images/anp.png",
    "language" : "es"
}]]
