Utilizei o secrets para adicionar numeros aleatorios e o string para adicionar letras, e os caracteres especiais ficaram por conta do punctuation
import secrets
import string
def gerador_senha(tamanho=12):
maiusculas = string.ascii_uppercase
minusculas = string.ascii_lowercase
numeros = string.digits
especiais = string.punctuation
senha = [secrets.choice(maiusculas), secrets.choice(minusculas), secrets.choice(numeros), secrets.choice(especiais)]
todos = maiusculas + minusculas + numeros + especiais
senha += [secrets.choice(todos) for _ in range(tamanho - 4)]
secrets.SystemRandom().shuffle(senha)
return ''.join(senha)
print(gerador_senha())
