Files
oam/knowledge base/python.md
2023-09-23 20:10:07 +02:00

6.8 KiB

Python

Table of contents

  1. TL;DR
  2. Dictionaries
  3. F-strings
  4. Logging
  5. CLI helpers
  6. Web servers
    1. Flask
    2. WSGI server
  7. Execute commands on the host
  8. Concurrent execution
  9. Further readings
  10. Sources

TL;DR

# 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

# 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

f"Hello, {name}. You are {age}."
F"{name.lower()} is funny."

Logging

Very basic logger:

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:

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
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:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "<h1>Hello!</h1>"

if __name__ == "__main__":
    from waitress import serve
    serve(app, host="0.0.0.0", port=8080)
pip install flask waitress
python hello.py

Execute commands on the host

Very basic execution:

import subprocess
subprocess.call(command)

See subprocess library for more information.

Concurrent execution

Very basic multi-threaded operations:

from concurrent.futures import ThreadPoolExecutor
from os import cpu_count

with ThreadPoolExecutor(max_workers=cpu_count()) as executor:
    for element in elements:
        logging.debug(f"submitting thread for {element}")
        executor.submit(function_name, function_arg_1, function_arg_n)

See concurrent execution for more information.

Further readings

Sources

All the references in the further readings section, plus the following: