Categorías
Python

Cómo hacer un Bot discordia en Python

 Filtros

Tabla de Contenidos Ejemplos

  • Quick
  • Frasco Ejemplos
  • herencia de plantillas
  • Super Blocks
  • macros
  • personalizada
  • Conclusión

frasco viene empaquetado con el potente lenguaje de plantillas Jinja.

Para aquellos que no han estado expuestos a un lenguaje de plantillas antes, tales lenguajes contienen esencialmente las variables, así como algo de lógica de programación, que cuando se evalúa (o crean en HTML) se sustituyen con los valores reales .

Las variables y / o lógica se colocan entre etiquetas o delimitadores. Por ejemplo, las plantillas de Jinja usan {% …%} para expresiones o lógica (como por bucles), mientras {{…}} se utiliza para la salida de los resultados de una expresión o una variable para el usuario final. Esta última etiqueta, cuando se representa, se sustituye con un valor o valores, y es visto por el usuario final.

Nota: plantillas Jinja son solo archivos .html. Por convención, que viven en el directorio templates / frasco en un proyecto. Si está familiarizado con el formato de cadenas o de interpolación, lenguajes de plantillas siguen un tipo similar de la lógica, justo en la escala de toda una página HTML. Bono

gratuito: Haga clic aquí para obtener acceso a una guía gratuita de plantillas Jinja Recursos (PDF) que le muestra sugerencias y trucos, así como trampas comunes que debe evitar cuando se trabaja con el lenguaje de plantillas Jinja 2. Ejemplos

Quick

Asegúrese de que ha instalado Jinja antes de ejecutar estos ejemplos (PIP instalar Jinja2):

>>> from jinja2 import Template
>>> t = Template("Hello {{ something }}!")
>>> t.render(something="World")
u'Hello World!'

>>> t = Template("My favorite numbers: {% for n in range(1,10) %}{{n}} " "{% endfor %}")
>>> t.render()
u'My favorite numbers: 1 2 3 4 5 6 7 8 9 '

Note como la salida real prestado al usuario cae dentro de las etiquetas. Ejemplos

Frasco

El código se pueden encontrar aquí.

Cree la siguiente estructura del proyecto:

├── requirements.txt
├── run.py
└── templates

Activar un virtualenv, a continuación, instalar frasco:

$ pip install flask

Agregue el código siguiente para run.py :

from flask import Flask, render_template
app = Flask(__name__)

@app.route("/")
def template_test():
return render_template('template.html', my_string="Wheeeee!", my_list=[0,1,2,3,4,5])

if __name__ == '__main__':
app.run(debug=True)

Aquí, estamos estableciendo la ruta /, lo que hace que la plantilla template.html a través de la render_template función (). Esta función debe tener un nombre de plantilla. Opcionalmente, se puede pasar en los argumentos de palabras clave para la plantilla, como en el ejemplo con mi_cadena y my_list.

Añadir la plantilla:




Flask Template Example<itle><br /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="http:/<br />etdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" media="screen"></p> <style type="text/css"> .container { max-width: 500px; padding-top: 100px; } </style> <p> </head><br /> <body></p> <div class="container"> <p>My string: {{my_string}}</p> <p>Value from the list: {{my_list[3]}}</p> <p>Loop through the list:</p> <ul> {% for n in my_list %}</p> <li>{{n}}</li> <p> {% endfor %} </ul> </p></div> <p> <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script><br /> <script src="http:/<br />etdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script><br /> </body><br /> </html><br /> </code> </p> <p> Guardar esto como <em> template.html </em> en el directorio de plantillas. Fíjese en las etiquetas de plantilla. Se puede adivinar la salida antes de ejecutar la aplicación? </p> <p> Ejecutar el siguiente: </p> <p> <code>$ python run.py<br /> </code> </p> <p> Debería ver lo siguiente: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/flask-jinja-example-basic.57f2955f4a35.png"> </p> <p> <strong> Nota: el valor de </strong> Se señaló que Jinja sólo es compatible con un par de estructuras de control: sentencias if y los bucles son las dos estructuras primarias. </p> <p> La sintaxis es similar a Python, que difieren en que no se requiere de colon y que la terminación del bloque se realiza utilizando un ENDIF o endfor en vez de espacios en blanco. </p> <p> También puede completar la lógica dentro de su controlador o puntos de vista y luego pasar cada valor a la plantilla usando las etiquetas de plantilla. Sin embargo, es mucho más fácil de realizar tal lógica dentro de las propias plantillas. </p> <h2> Plantilla Inheritance </h2> <p> plantillas </p> <p> generalmente tomar ventaja de la herencia, que incluye una plantilla de una sola base que define la estructura básica de todas las plantillas hijas posteriores. Utiliza las etiquetas {% extends%} y {% block%} para implementar herencia. </p> <p> El caso de uso de esto es simple: como su aplicación crece, y usted continúa añadiendo nuevas plantillas, tendrá que mantener el código común (como una barra de navegación HTML, librerías Javascript, hojas de estilo CSS, etc.) en sincronía, lo cual puede ser un montón de trabajo. El uso de la herencia, podemos mover las piezas comunes a una plantilla padre / base, de manera que podemos crear o editar dicho código una vez, y todas las plantillas niño va inherente código que. </p> <p> <strong> Nota: </strong> Siempre se debe añadir al menos cantidad de código que se repite como sea posible a su plantilla base para ahorrar tiempo en el futuro, que son muy superiores a la inversión inicial de tiempo. </p> <p> Vamos a añadir herencia a nuestro ejemplo. </p> <p> Crear la base (o el padre) plantilla: </p> <p> <code><!DOCTYPE html><br /> <html><br /> <head><br /> <title>Flask Template Example<itle><br /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="http:/<br />etdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" media="screen"></p> <style type="text/css"> .container { max-width: 500px; padding-top: 100px; } h2 {color: red;} </style> <p> </head><br /> <body></p> <div class="container"> <h2>This is part of my base template</h2> <p> {% block content %}{% endblock %}<br /> </p> <h2>This is part of my base template</h2> </p></div> <p> <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script><br /> <script src="http:/<br />etdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script><br /> </body><br /> </html><br /> </code> </p> <p> Guardar esto como <em> layout.html </em>. </p> <p> ¿Se notaron los {% block%} etiquetas? Esto define un bloque (o área) que las plantillas niño pueden rellenar. Además, esta sólo informa al motor, de plantillas que una plantilla niño puede anular el bloque de la plantilla. </p> <p> <strong> Nota: </strong> pensar en ellos como marcadores de posición debe ser rellenado por el código de la plantilla hija (s). de </p> <p> dejar hacer eso. </p> <p> actualización <em> template.html </em>: </p> <p> <code>{% extends "layout.html" %}<br /> {% block content %}</p> <h3> This is the start of my child template</h3> <p></p> <p>My string: {{my_string}}</p> <p>Value from the list: {{my_list[3]}}</p> <p>Loop through the list:</p> <ul> {% for n in my_list %}</p> <li>{{n}}</li> <p> {% endfor %} </ul> <h3> This is the end of my child template</h3> <p>{% endblock %}<br /> </code> </p> <p> Así, el {% extends%} informa al motor de plantillas que esta plantilla “se extiende” otra plantilla, <em> layout.html </em>. Esto establece el vínculo entre las plantillas. </p> <p> ejecutarlo. Visita obligatoria: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/flask-jinja-example-inheritance.3773d26c6ed9.png"> </p> <p> Un caso de uso común es añadir una barra de navegación. </p> <p> Agregue el código siguiente a la plantilla base, justo después de la etiqueta de apertura <body>: </p> <p> <code></p> <nav class="navbar navbar-inverse" role="navigation"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"><br /> <span class="sr-only">Toggle navigation</span><br /> <span class="icon-bar"></span><br /> <span class="icon-bar"></span><br /> <span class="icon-bar"></span><br /> </button><br /> <a class="navbar-brand" href="/">Jinja!</a> </div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li class="active"><a href="#">Link</a></li> <li><a href="#">Link</a></li> </ul> <form class="navbar-form navbar-left" role="search"> <div class="form-group"> <input type="text" class="form-control" placeholder="Search"> </div> <p> <button type="submit" class="btn btn-default">Submit</button><br /> </form> <ul class="nav navbar-nav navbar-right"> <li><a href="#">Link</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a></p> <ul class="dropdown-menu"> <li><a href="#">Action</a></li> <li><a href="#">Another action</a></li> <li><a href="#">Something else here</a></li> <li class="divider"></li> <li><a href="#">Separated link</a></li> </ul> </li> </ul></div> <p><!-- /.navbar-collapse --> </div> <p><!-- /.container-fluid --><br /> <<br />av><br /> </code> </p> <p> Ahora, cada plantilla de uno de los niños que se extiende desde la base tendrá la misma barra de navegación. Para robar una línea de la filosofía de Java: “Escribir una vez, su uso en cualquier lugar.” </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/flask-jinja-example-navbar.a1829e2751b0.png"> </p> <h2> Super Blocks </h2> <p> Si usted necesita para hacer un bloque de la plantilla base, use un superbloque: </p> <p> <code>{{ super() }}<br /> </code> </p> <p> Añadir un pie de página a la plantilla base: </p> <p> <code></p> <div class="footer"> {% block footer %}<br /> Watch! This will be added to my base and child templates using the super powerful super block!</p> <p> {% endblock %} </p></div> <p></code> </p> <p> Aquí está el código de actualización: </p> <p> <code><!DOCTYPE html><br /> <head><br /> <title>Flask Template Example<itle><br /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="http:/<br />etdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" media="screen"></p> <style type="text/css"> .container { max-width: 500px; padding-top: 100px; } h2 {color: red;} </style> <p> </head><br /> <body></p> <div class="container"> <h2>This is part of my base template</h2> <p> {% block content %}{% endblock %}<br /> </p> <h2>This is part of my base template</h2> <p></p> <div class="footer"> {% block footer %}<br /> Watch! This will be added to my base and child templates using the super powerful super block!</p> <p> {% endblock %} </div> </p></div> <p> <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script><br /> <script src="http:/<br />etdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script><br /> </body><br /> </html><br /> </code> </p> <p> Ejecutar el aplicación. Debería ver que el pie de página es sólo una parte de la base: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/flask-jinja-example-super.a71254fdfdc7.png"> </p> <p> Ahora, añadir el superbloque a <em> template.html </em>: </p> <p> <code>{% extends "layout.html" %}<br /> {% block content %}</p> <h3> This is the start of my child template</h3> <p></p> <p>My string: {{my_string}}</p> <p>Value from the list: {{my_list[3]}}</p> <p>Loop through the list:</p> <ul> {% for n in my_list %}</p> <li>{{n}}</li> <p> {% endfor %} </ul> <h3> This is the end of my child template</h3> <p> {% block footer %}<br /> {{super()}}<br /> {% endblock %}<br /> {% endblock %}<br /> </code> </p> <p> comprobar que en su navegador: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/flask-jinja-example-super-2.853f387a8867.png"> </p> <p> El superbloque es utilizar para el código común que los padres y el niño plantillas de acción, tales como el <title>, donde ambas plantillas comparten parte del título. Entonces, sólo se necesita para pasar en la otra parte. También podría ser utilizado para un título. </p> <p> He aquí un ejemplo: Véase la </p> <p> <strong> Padres </strong> </p> <p> <code>{% block heading %}</p> <h1>{% block page %}{% endblock %} - Flask Super Example</h1> <p>{% endblock %}<br /> </code> </p> <p> <strong> Niño </strong> </p> <p> <code>{% block page %}Home{% endblock %}<br /> {% block heading %}<br /> {{ super() }}<br /> {% endblock %}<br /> </code> </p> <p> dejar que eso en acción: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/flask-jinja-example-super-3.57e27ebe8c9b.png"> </p> <p> ver lo que sucede cuando se quita {% página de bloqueo%} Inicio {% endblock%} de la plantilla hija. </p> <p> <strong> Desafío </strong>: tratar de actualizar el <title> utilizando el mismo método con el superbloque. Echa un vistazo a mi código si necesita ayuda. </p> <p> En lugar de codificar duro el nombre de la plantilla, vamos a hacer que dinámico. </p> <p> actualización de los dos fragmentos de código en <em> template.html </em>: </p> <p> <code>{% block title %}{{title}}{% endblock %}<br /> </code> <code>{% block page %}{{title}}{% endblock %}<br /> </code> </p> <p> Ahora, tenemos que pasar en una variable título a nuestra plantilla a partir de nuestro controlador, <em> run.py </em>: </p> <p> <code>@app.route("/")<br /> def template_test():<br /> return render_template(<br /> 'template.html', my_string="Wheeeee!",<br /> my_list=[0,1,2,3,4,5], title="Home")<br /> </code> prueba </p> <p> esto. </p> <h2> macros </h2> <p> En Jinja, podemos utilizar macros para fragmentos de código utilizados comúnmente abstractos que se utilizan una y otra vez para no repetir nosotros mismos. Por ejemplo, es común para resaltar el enlace de la página actual en la barra de navegación (enlace activo). De lo contrario, tendríamos que usar si elif / declaraciones / else para determinar el enlace activo. Con ellas, podemos abstraer a cabo dicho código en un archivo separado. </p> <p> Añadir un archivo <em> macros.html </em> al directorio de plantillas: </p> <p> <code>{% macro nav_link(endpoint, name) %}<br /> {% if request.endpoint.endswith(endpoint) %}</p> <li class="active"><a href="{{ url_for(endpoint) }}">{{name}}</a></li> <p>{% else %}</p> <li><a href="{{ url_for(endpoint) }}">{{name}}</a></li> <p>{% endif %}<br /> {% endmacro %}<br /> </code> </p> <p> Aquí, estamos usando objeto de solicitud de Frasco, que es parte de Jinja por defecto, para comprobar el punto final solicitada, y luego asignar la clase activa a ese punto final. </p> <p> actualización de la lista desordenada con la clase de navegación barra de navegación de navegación por la plantilla base: </p> <p> <code></p> <ul class="nav navbar-nav"> {{ nav_link('home', 'Home') }}<br /> {{ nav_link('about', 'About') }}<br /> {{ nav_link('contact', 'Contact Us') }} </ul> <p></code> </p> <p> Además, asegúrese de añadir la importación en la parte superior de la plantilla: {% de «macros.html» nav_link importación con el contexto%} . </p> <p> Aviso cómo estamos llamando a la macro-nav enlace y pasándolo a dos argumentos: el punto final (que proviene de nuestro controlador) y el texto que queremos que se muestra. </p> <p> Por último, vamos a añadir tres nuevos puntos finales al controlador: </p> <p> <code>@app.route("/home")<br /> def home():<br /> return render_template(<br /> 'template.html', my_string="Wheeeee!",<br /> my_list=[0,1,2,3,4,5], title="Home")</p> <p>@app.route("/about")<br /> def about():<br /> return render_template(<br /> 'template.html', my_string="Wheeeee!",<br /> my_list=[0,1,2,3,4,5], title="About")</p> <p>@app.route("/contact")<br /> def contact():<br /> return render_template(<br /> 'template.html', my_string="Wheeeee!",<br /> my_list=[0,1,2,3,4,5], title="Contact Us")<br /> </code> </p> <p> actualizar la página. Prueba de los enlaces en la parte superior. ¿La página actual ObtenerTextoSeleccionado? Debería. Filtros </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/flask-jinja-example-macros.a563706b0663.png"> </p> <h2> personalizada </h2> <p> Jinja utiliza filtros para modificar las variables, sobre todo para fines de formato. </p> <p> He aquí un ejemplo: </p> <p> <code>{{ num | round }}<br /> </code> </p> <p> Esto redondear la variable num. Por lo tanto, si pasamos el argumento num = 46.99 en la plantilla, a continuación, se emitirán 47,0. </p> <p> como se puede decir, se especifica la variable y luego una barra vertical (|), seguido por el filtro. Echa un vistazo a este enlace para obtener la lista de filtros ya incluidos dentro de Jinja. En algunos casos, puede especificar argumentos opcionales entre paréntesis. </p> <p> He aquí un ejemplo: </p> <p> <code>{{ list|join(', ') }}<br /> </code> </p> <p> Este se unirá a una lista por el delimitador de coma. Prueba </p> <p> esto. Añada la siguiente línea a <em> template.html </em> </p> <p> <code></p> <p>Same list with a filter: {{ my_list|join(', ') }}</p> <p></code> </p> <p> Ahora, además de la incorporada en filtros, podemos crear nuestro propio. un complemento de </p> <p> Let de los nuestros. Un ejemplo común es un filtro de fecha y hora personalizado. </p> <p> Agregue el código siguiente a nuestro controlador después de crear la aplicación, app = Frasco (__ name__): </p> <p> <code>@app.template_filter()<br /> def datetimefilter(value, format='%Y/%m/%d %H:%M'):<br /> """Convert a datetime to a different format."""<br /> return value.strftime(format)</p> <p>app.jinja_env.filters['datetimefilter'] = datetimefilter<br /> </code> </p> <p> Usando el decorador @ app.template_filter (), estamos registrando la función datetimefilter () como un filtro. </p> <p> <strong> Nota: </strong> El nombre por defecto para el filtro es sólo el nombre de la función. Sin embargo, se puede personalizar mediante el paso en un argumento de la función, por ejemplo @ app.template_filter (formatDate). </p> <p> A continuación, se añadió el filtro para el medio ambiente Jinja, por lo que es accesible. Ahora ya está listo para su uso. </p> <p> Agregue el código siguiente a nuestra plantilla hija: </p> <p> <code></p> <h4>Current dateime: {{ current_time | datetimefilter }}</h4> <p></code> </p> <p> Por último, sólo tiene que pasar en la fecha y hora a nuestra plantilla: </p> <p> <code>current_time = datetime.datetime.now()<br /> </code> </p> <p> probarlo. </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/flask-jinja-example-filter.2e9ae41d5de9.png"> </p> <h2> Conclusión Bono </h2> <p> <strong> gratuito: </strong> Haga clic aquí para obtener acceso a una guía gratuita Jinja Plantillas Recursos (PDF) que le muestra sugerencias y trucos, así como trampas comunes que debe evitar cuando se trabaja con el lenguaje de plantillas Jinja 2. </p> <p> Eso es todo. Coge el código de ejemplo aquí. ¿Yo me perdí algo? Deja un comentario más abajo. </p> </div><!-- .entry-content --> </div><!-- .post-inner --> <div class="section-inner"> </div><!-- .section-inner --> <nav class="pagination-single section-inner" aria-label="Entrada" role="navigation"> <hr class="styled-separator is-style-wide" aria-hidden="true" /> <div class="pagination-single-inner"> <a class="previous-post" href="https://eltecnofilo.es/sintaxis-no-valida-en-python-razones-comunes-para-syntaxerror/"> <span class="arrow" aria-hidden="true">←</span> <span class="title"><span class="title-inner">Sintaxis no válida en Python: Razones comunes para SyntaxError</span></span> </a> <a class="next-post" href="https://eltecnofilo.es/frasco-por-ejemplo-la-implementacion-de-una-cola-de-tareas-redis/"> <span class="arrow" aria-hidden="true">→</span> <span class="title"><span class="title-inner">Frasco por Ejemplo – La implementación de una cola de tareas Redis</span></span> </a> </div><!-- .pagination-single-inner --> <hr class="styled-separator is-style-wide" aria-hidden="true" /> </nav><!-- .pagination-single --> <div class="comments-wrapper section-inner"> <div id="respond" class="comment-respond"> <h2 id="reply-title" class="comment-reply-title">Deja un comentario <small><a rel="nofollow" id="cancel-comment-reply-link" href="/como-hacer-un-bot-discordia-en-python/#respond" style="display:none;">Cancelar la respuesta</a></small></h2><form action="https://eltecnofilo.es/wp-comments-post.php" method="post" id="commentform" class="section-inner thin max-percentage" novalidate><p class="comment-notes"><span id="email-notes">Tu dirección de correo electrónico no será publicada.</span> Los campos obligatorios están marcados con <span class="required">*</span></p><p class="comment-form-comment"><label for="comment">Comentario</label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required"></textarea></p><p class="comment-form-author"><label for="author">Nombre <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" required='required' /></p> <p class="comment-form-email"><label for="email">Correo electrónico <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" required='required' /></p> <p class="comment-form-url"><label for="url">Web</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" /></p> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">Guardar mi nombre, correo electrónico y sitio web en este navegador para la próxima vez que haga un comentario.</label></p> <p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Publicar el comentario" /> <input type='hidden' name='comment_post_ID' value='6957' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p></form> </div><!-- #respond --> </div><!-- .comments-wrapper --> </article><!-- .post --> </main><!-- #site-content --> <div class="footer-nav-widgets-wrapper header-footer-group"> <div class="footer-inner section-inner"> <aside class="footer-widgets-outer-wrapper" role="complementary"> <div class="footer-widgets-wrapper"> <div class="footer-widgets column-one grid-item"> <div class="widget widget_search"><div class="widget-content"><form role="search" method="get" class="search-form" action="https://eltecnofilo.es/"> <label for="search-form-2"> <span class="screen-reader-text">Buscar:</span> <input type="search" id="search-form-2" class="search-field" placeholder="Buscar …" value="" name="s" /> </label> <input type="submit" class="search-submit" value="Buscar" /> </form> </div></div> <div class="widget widget_recent_entries"><div class="widget-content"> <h2 class="widget-title subheading heading-size-3">Entradas recientes</h2> <ul> <li> <a href="https://eltecnofilo.es/vps-cloud-hosting/">VPS cloud hosting</a> </li> <li> <a href="https://eltecnofilo.es/versiones-de-ejecucion-de-python-en-acoplable-como-probar-la-ultima-release-python/">Versiones de ejecución de Python en acoplable: Cómo probar la última Release Python</a> </li> <li> <a href="https://eltecnofilo.es/leer-y-escribir-archivos-csv/">Leer y escribir archivos CSV</a> </li> <li> <a href="https://eltecnofilo.es/python-puro-vs-vs-numpy-tensorflow-comparacion-de-rendimiento/">Python puro vs vs NumPy TensorFlow Comparación de Rendimiento</a> </li> <li> <a href="https://eltecnofilo.es/estructura-python-programa-lexico/">Estructura Python Programa léxico</a> </li> </ul> </div></div><div class="widget widget_recent_comments"><div class="widget-content"><h2 class="widget-title subheading heading-size-3">Comentarios recientes</h2><ul id="recentcomments"><li class="recentcomments"><span class="comment-author-link"><a href="https://wordpress.org/" rel="external nofollow ugc" class="url">A WordPress Commenter</a></span> en <a href="https://eltecnofilo.es/hello-world/#comment-1">Hello world!</a></li></ul></div></div> </div> <div class="footer-widgets column-two grid-item"> <div class="widget widget_archive"><div class="widget-content"><h2 class="widget-title subheading heading-size-3">Archivos</h2> <ul> <li><a href='https://eltecnofilo.es/2020/04/'>abril 2020</a></li> <li><a href='https://eltecnofilo.es/2020/03/'>marzo 2020</a></li> <li><a href='https://eltecnofilo.es/2019/12/'>diciembre 2019</a></li> </ul> </div></div><div class="widget widget_categories"><div class="widget-content"><h2 class="widget-title subheading heading-size-3">Categorías</h2> <ul> <li class="cat-item cat-item-22"><a href="https://eltecnofilo.es/category/python/">Python</a> </li> <li class="cat-item cat-item-1"><a href="https://eltecnofilo.es/category/uncategorized/">Uncategorized</a> </li> </ul> </div></div><div class="widget widget_meta"><div class="widget-content"><h2 class="widget-title subheading heading-size-3">Meta</h2> <ul> <li><a rel="nofollow" href="https://eltecnofilo.es/wp-login.php">Acceder</a></li> <li><a href="https://eltecnofilo.es/feed/">Feed de entradas</a></li> <li><a href="https://eltecnofilo.es/comments/feed/">Feed de comentarios</a></li> <li><a href="https://es.wordpress.org/">WordPress.org</a></li> </ul> </div></div> </div> </div><!-- .footer-widgets-wrapper --> </aside><!-- .footer-widgets-outer-wrapper --> </div><!-- .footer-inner --> </div><!-- .footer-nav-widgets-wrapper --> <footer id="site-footer" role="contentinfo" class="header-footer-group"> <div class="section-inner"> <div class="footer-credits"> <p class="footer-copyright">© 2020 <a href="https://eltecnofilo.es/">My Blog</a> </p><!-- .footer-copyright --> <p class="powered-by-wordpress"> <a href="https://es.wordpress.org/"> Funciona gracias a WordPress </a> </p><!-- .powered-by-wordpress --> </div><!-- .footer-credits --> <a class="to-the-top" href="#site-header"> <span class="to-the-top-long"> Ir arriba <span class="arrow" aria-hidden="true">↑</span> </span><!-- .to-the-top-long --> <span class="to-the-top-short"> Subir <span class="arrow" aria-hidden="true">↑</span> </span><!-- .to-the-top-short --> </a><!-- .to-the-top --> </div><!-- .section-inner --> </footer><!-- #site-footer --> <script src='https://eltecnofilo.es/wp-includes/js/comment-reply.min.js?ver=5.3.3'></script> <script src='https://eltecnofilo.es/wp-includes/js/wp-embed.min.js?ver=5.3.3'></script> <script> /(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1); </script> </body> </html>