@Schwarzer Wolf: Was ist eigentlich `secrets.choice()`? Hast Du etwa das `random`-Modul in `secrets` umbenannt?
Was auch etwas schräg ist `get_files_from_directory()` erweitert die `self._files`-Liste gar nicht um die Dateinamen, sondern hängt da eine *Liste* mit Dateinamen an, während `get_specified_files_from_directory()` die einzelnen Dateinamen an diese Liste anhängt‽
Die beiden Methoden unterscheiden sich zudem noch darin ob sie nur Dateinamen oder auch Ordnernamen im Ergebnis haben. `self._user_extensions` wird nirgends verwendet. Die Klasse ist echt ziemlich schräg.
`dir_path` wird in `get_specified_files_from_directory()` gar nicht verwendet.
Ausserdem wird pro Unterverzeichnis auf der aktuellen Ebene von `os.walk()` jede Datei verarbeitet, dass heisst wenn es kein Unterverzeichnis gibt aber Dateien dann wird keine davon verarbeitet, wenn es drei Unterverzeichnisse gibt, dann wird jede Datei dreimal verarbeitet und so weiter. Dass das `directory` auch noch an `file_path` gejoined wird ist falsch. Das ist ziemlich kaputt. Hast Du diese Klasse überhaupt schon mal irgendwo benutzt? Unittests sind ein tolle Sache.
Was hier letztlich übrig bleibt sind folgende drei Funktionen (ungetestet):
Code: Alles auswählen
def create_password(length, hard=False):
"""Create a password.
:param length: int
:param hard: bool -> std False
Creates a password of the desired length. By default all
ascii letters are used (upper and lower case) and numbers.
If hard is on <True>, special characters are also used.
:return: str
"""
characters = string.ascii_letters + string.digits
if hard:
characters += string.punctuation
return ''.join(random.choice(characters) for _ in range(length))
def get_paths(path):
return glob.glob(os.path.join(path, '**'), recursive=True)
def get_filenames(path, excluded=()):
result = list()
for root, _, filenames in os.walk(path):
for filename in filenames:
full_path = os.path.join(root, filename)
if not any(part in full_path for part in excluded):
result.append(full_path)
return result