# The secrets module is used for generating cryptographically strong random
# numbers suitable for managing data such as passwords, account authentication,
# security tokens, and related secrets.
# In particularly, secrets should be used in preference to the default
# pseudo-random number generator in the random module, which is designed for
# modelling and simulation, not security or cryptography.
# 
# Requires Python 3.6+
# import secrets
import random
import string

def ascii_string(
    length   = 32,
    alphabet = string.ascii_letters + string.digits + string.punctuation):
    
    # return ''.join (secrets.choice (alphabet) for i in range (length))
    return ''.join(random.choice(alphabet) for i in range(length))

def alphanumeric_string(length = 32):
    return ascii_string(length, string.ascii_letters + string.digits)

def digit_string(length = 32):
    return ascii_string(length, alphabet = string.digits)

def hex_string(length = 32):
    return ascii_string(length, alphabet = string.hexdigits)
