(length, symbolgroups=None)
return ''.join(password)
Generate a random password from the supplied symbol groups.

    At least one symbol from each group will be included. Unpredictable
    results if length is less than the number of symbol groups.

    Believed to be reasonably secure (with a reasonable password length!)
Generate a random password from the supplied symbol groups.
Generate a random password from the supplied symbol groups .
def generate_password(length, symbolgroups=None):
    """Generate a random password from the supplied symbol groups.

    At least one symbol from each group will be included. Unpredictable
    results if length is less than the number of symbol groups.

    Believed to be reasonably secure (with a reasonable password length!)

    """

    if symbolgroups is None:
        symbolgroups = CONF.password_symbols

    r = random.SystemRandom()

    # NOTE(jerdfelt): Some password policies require at least one character
    # from each group of symbols, so start off with one random character
    # from each symbol group
    password = [r.choice(s) for s in symbolgroups]
    # If length < len(symbolgroups), the leading characters will only
    # be from the first length groups. Try our best to not be predictable
    # by shuffling and then truncating.
    r.shuffle(password)
    password = password[:length]
    length -= len(password)

    # then fill with random characters from all symbol groups
    symbols = ''.join(symbolgroups)
    password.extend([r.choice(symbols) for _i in range(length)])

    # finally shuffle to ensure first x characters aren't from a
    # predictable group
    r.shuffle(password)

    return ''.join(password)
def generate_password ( length , symbolgroups = None ) : if symbolgroups is None : symbolgroups = CONF . password_symbols r = random . SystemRandom ( ) # NOTE(jerdfelt): Some password policies require at least one character # from each group of symbols, so start off with one random character # from each symbol group password = [ r . choice ( s ) for s in symbolgroups ] # If length < len(symbolgroups), the leading characters will only # be from the first length groups. Try our best to not be predictable # by shuffling and then truncating. r . shuffle ( password ) password = password [ : length ] length -= len ( password ) # then fill with random characters from all symbol groups symbols = '' . join ( symbolgroups ) password . extend ( [ r . choice ( symbols ) for _i in range ( length ) ] ) # finally shuffle to ensure first x characters aren't from a # predictable group r . shuffle ( password ) return '' . join ( password )