Gostaria de saber se tem formas de deixar esse código mais compacto, sem perder a lógica original
import string
import random
caracteresSenha = list(string.printable)
def geradorDeSenha():
senhaGerada = []
uppercase = random.choice(string.ascii_uppercase)
lowercase = random.choice(string.ascii_lowercase)
number = random.choice(string.digits)
special = random.choice(string.punctuation)
chars = list(uppercase+lowercase+number+special) #Garantindo que a senha tenha ao menos um de cada
senhaGerada.extend(chars)
random.shuffle(senhaGerada) #Embaralhando os caracteres iniciais para nunca ficarem na mesma ordem
senhaGerada.extend(random.choices(caracteresSenha, k=8)) #Selecionando mais 8 caracteres aleatórios
senhaFinal = ''.join(senhaGerada) #Armazenando os items da lista em uma string
senhaFinal = senhaFinal.replace(" ", "") #Removendo os espaços da string
print(senhaFinal)