# Python ## Table of contents 1. [TL;DR](#tldr) 1. [Dictionaries](#dictionaries) 1. [F-strings](#f-strings) 1. [Logging](#logging) 1. [CLI helpers](#cli-helpers) 1. [Web servers](#web-servers) 1. [Flask](#flask) 1. [WSGI server](#wsgi-server) 1. [Execute commands on the host](#execute-commands-on-the-host) 1. [Concurrent execution](#concurrent-execution) 1. [Further readings](#further-readings) 1. [Sources](#sources) ## TL;DR ```py # Declare tuples. # If only 1 element, it requires the ending ','. (1, 'string') ('element',) # Declare dictionaries. {'spam': 2, 'ham': 1, 'eggs': 3} dict(spam=2,ham=1,eggs=3) dict([('spam',2),('ham',1),('eggs',3)]) # String formatting with f-strings. f"Hello, {name}. You are {age}." F"{name.lower()} is funny." # Make elements in a list unique. # Keep the resulting list mutable. # Sorts the elements (it is a set "feature"). unique_elements = list(set(redundant_elements)) ``` ## Dictionaries ```py # Declare dictionaries. d = {'spam': 2, 'ham': 1, 'eggs': 3} d = dict(spam=2,ham=1,eggs=3) d = dict([('spam',2),('ham',1),('eggs',3)]) d = {x: x for x in range(5)} d = {c.lower(): c + '!' for c in ['SPAM','EGGS','HAM']} d = dict.fromkeys('abc',0) # Change elements. d['ham'] = ['grill', 'bake', 'fry'] # Add new elements. d['brunch'] = 'bacon' # Delete elements. del d['eggs'] d.pop('eggs') # List values and/or keys. d.values() d.keys() d.items() # Print the elements and their values. for k,v in d.items(): print(k,v) # Merge dictionaries. d1 = {'spam': 2, 'ham': 1, 'eggs': 3} d2 = {'toast': 4, 'muffin': 5, 'eggs': 7} d1.update(d2) # Copy dictionaries. d1 = {'spam': 2, 'ham': 1, 'eggs': 3} d2 = d1.copy() ``` ## F-strings ```py f"Hello, {name}. You are {age}." F"{name.lower()} is funny." ``` ## Logging Very basic logger: ```py import logging logging.basicConfig(level=logging.WARNING) logging.critical("CRITICAL level message") logging.exception("ERROR level message") logging.error("ERROR level message") logging.warning("WARNING level message") logging.info("INFO level message") logging.debug("DEBUG level message") logging.log(level, "{level} level message") ``` See [logging howto] and [logging library] for more information. ## CLI helpers See [click]: ```py import click @click.command() @click.option('--count', default=1, help='Number of greetings.') @click.option('--name', prompt='Your name', help='The person to greet.') def hello(count, name): """Simple program that greets NAME for a total of COUNT times.""" for x in range(count): click.echo(f"Hello {name}!") if __name__ == '__main__': hello() ``` ## Web servers ### Flask - `request.args` gets query arguments - `request.form` gets POST arguments ```py from flask import request, jsonify @app.route('/get/questions/', methods=['GET', 'POST','DELETE', 'PATCH']) def question(): if request.method == 'GET': start = request.args.get('start', default=0, type=int) limit_url = request.args.get('limit', default=20, type=int) data = [doc for doc in questions] return jsonify( isError = False, message = "Success", statusCode = 200, data= data ), 200 if request.method == 'POST': question = request.form.get('question') topics = request.form.get('topics') return jsonify( isError = True, message = "Conflict", statusCode = 409, data = data ), 409 ``` ### WSGI server You can use `waitress`: ```py from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "