Hallo Sirius3,
habe mir noch mal deinen Code angesehen in der Hoffnung zumindest ein wenig (sehr wenig) davon zu Verstehen.
z.B. in 16. steht:
for current_path, _, files in os.walk(path):
Was hat denn dieser vereinsamte Unterstrich zu Bedeuten ?
soll "_" das schon eine Variable sein ?
print-Anweisung zeitgleich in Tex-Widget umleiten
@Max77: Jup, der Unterstrich ist ein gültiger Name. Wird konventionell für Werte verwendet wo man aus syntaktischen Gründen einen Namen schreiben muss, man aber an dem Wert kein Interesse hat und ihn deshalb nicht verwendet.
@BlackJack: Aus syntaktischen Gründen ??? Wenn dieser Unterstrich nicht verwendet wird und auch dessen Wert nicht interessiert warum schreibt man ihn dann ?
Kann man den nicht weg lassen ?
Was bedeutet aus syntaktischen Gründen ? Wieso will der Python-Interpreter den Unterstrich haben ?
Kannst du ein einfaches Beispiel geben woraus dieser Sinn ersichtlich wird ?
[ HIELFE - DIESE PROFIS MACHEN SO KOMISCHE SACHEN ]
PS: Was hälst du von meinem Video ? Gibt es den Sachverhalt richtig wieder ?
https://click.email.vimeo.com/?qs=9d9b9 ... a157328447
Kann man den nicht weg lassen ?
Was bedeutet aus syntaktischen Gründen ? Wieso will der Python-Interpreter den Unterstrich haben ?
Kannst du ein einfaches Beispiel geben woraus dieser Sinn ersichtlich wird ?
[ HIELFE - DIESE PROFIS MACHEN SO KOMISCHE SACHEN ]
PS: Was hälst du von meinem Video ? Gibt es den Sachverhalt richtig wieder ?
https://click.email.vimeo.com/?qs=9d9b9 ... a157328447
@Max77: Wenn man rechts von der Zuweisung ein Tupel mit drei Werten hat, dann müssen links davon auch drei Namen stehen. Auch wenn einen nicht alle drei Werte interessieren. Wenn da nur zwei Namen stünden, wie sollte dann die Zuweisung von drei Werten funktionieren?
Python will an der Stelle nicht den Unterstrich haben, aber einen Namen, denn da wird ein Wert zugewiesen und dafür braucht man einen Namen. Man könnte jetzt anstelle des Unterstrichs auch einen anderen Namen nehmen, beispielsweise:
`dummy` wäre aber ein Name den man vielleicht auch sinnvoll für einen Wert verwenden könnte der einen im weiteren Programmverlauf interessiert. Oder auch nicht, aber ein Leser könnte das trotzdem erwarten und sich wundern warum der Name an einen Wert gebunden wird, dann aber nicht verwendet wird. Und sich fragen ob das ein Fehler im Programm ist, oder ob es nicht nicht fertig ist, und da noch irgend etwas mit dem Wert gemacht werden sollte. `_` ist ein Name der keine Bedeutung vermittelt, und er ist sehr ”unauffällig”, und ein '_' wird in der Informatik auch manchmal als Zeichen für ein „blank“ verwendet wo man dieses ”Leerzeichen” von anderen Leerzeichen im Text unterscheiden können muss. Und es gibt andere Programmiersprachen wo das festerer Bestandteil der Syntax ist, statt einfach nur ein Name wie jeder andere, und wo es aber genau in dieser Bedeutung gebraucht wird: hier steht ein Wert, der interessiert aber nicht. Beispiel dafür wäre die „pattern matching“-Syntax bei Haskell.
Code: Alles auswählen
In [1]: xs = (23, 'uninteressant', 42)
In [2]: a, _, b = xs
In [3]: a
Out[3]: 23
In [4]: b
Out[4]: 42
Code: Alles auswählen
In [6]: a, dummy, b = xs
In [7]: a
Out[7]: 23
In [8]: dummy
Out[8]: 'uninteressant'
In [9]: b
Out[9]: 42
Das mit dem Tupelauspacken und dem Sinn des Unterstrichs habe ich nun verstanden.
Bei Zeile 16.
for current_path, _, files in os.walk(path):
packst du auch eine Tupel mit drei Elementen aus.
current_path , _ , files = Tupel
WO aber wird im Code die Tupel eingepackt ? Das muß doch VORHER zwischen Zeile 1. und 15.
geschehen. Denn wer Auspacken will muß ja auch vorher Eingepackt haben.
Bei Zeile 16.
for current_path, _, files in os.walk(path):
packst du auch eine Tupel mit drei Elementen aus.
current_path , _ , files = Tupel
WO aber wird im Code die Tupel eingepackt ? Das muß doch VORHER zwischen Zeile 1. und 15.
geschehen. Denn wer Auspacken will muß ja auch vorher Eingepackt haben.
@Max77: Die Tupel werden von `os.walk()` erstellt und geliefert:
In Zeile 34 bzw. 41, je nach dem ob `topdown` wahr oder falsch ist, und in Zeile 39 werden die Tupel von dem rekursiven Aufruf durchgereicht. (Den DocString habe ich gekürzt wiedergegeben.)
Code: Alles auswählen
def walk(top, topdown=True, onerror=None, followlinks=False):
"""Directory tree generator.
For each directory in the directory tree rooted at top (including top
itself, but excluding '.' and '..'), yields a 3-tuple
dirpath, dirnames, filenames
[…]
"""
islink, join, isdir = path.islink, path.join, path.isdir
# We may not have read permission for top, in which case we can't
# get a list of the files the directory contains. os.path.walk
# always suppressed the exception then, rather than blow up for a
# minor reason when (say) a thousand readable directories are still
# left to visit. That logic is copied here.
try:
# Note that listdir and error are globals in this module due
# to earlier import-*.
names = listdir(top)
except error, err:
if onerror is not None:
onerror(err)
return
dirs, nondirs = [], []
for name in names:
if isdir(join(top, name)):
dirs.append(name)
else:
nondirs.append(name)
if topdown:
yield top, dirs, nondirs
for name in dirs:
new_path = join(top, name)
if followlinks or not islink(new_path):
for x in walk(new_path, topdown, onerror, followlinks):
yield x
if not topdown:
yield top, dirs, nondirs
Jaaah Natürlich ! Man bin ich Blind. os.walk liefert ja eine Dreier-Tupel zurück.
Das hatte ich gar nicht mehr auf der „Rechnung“
Ich glaube die Funktion calculate_hashes verstanden zu haben.
Der 1. Parameter nimmt den zu untersuchenden Ordner+Pfad in Empfang.
Der 2. Parameter den DatenausgabeOrdner entgegen.
Mit dem 3. Parameter sagt man der Funktion WOHIN der Datenstrom geliefert werden soll.
In diesem Falle in eine Warteschlange.
calculate_hashes wird in einem Thread ausgeführt d.H. Die Funktion läuft parallel zur TK-GUI
und kann diese nicht mehr blockieren.
Aber der Abschnitt zwischen Zeile 25. und Zeile 30. ist mir noch nicht klar.
Wozu dient die while Schleife ?
Was bedeutet bytes = data.read(65536) ?
Ist bytes eine Build-In Funktion ?
Das hatte ich gar nicht mehr auf der „Rechnung“
Ich glaube die Funktion calculate_hashes verstanden zu haben.
Der 1. Parameter nimmt den zu untersuchenden Ordner+Pfad in Empfang.
Der 2. Parameter den DatenausgabeOrdner entgegen.
Mit dem 3. Parameter sagt man der Funktion WOHIN der Datenstrom geliefert werden soll.
In diesem Falle in eine Warteschlange.
calculate_hashes wird in einem Thread ausgeführt d.H. Die Funktion läuft parallel zur TK-GUI
und kann diese nicht mehr blockieren.
Aber der Abschnitt zwischen Zeile 25. und Zeile 30. ist mir noch nicht klar.
Wozu dient die while Schleife ?
Was bedeutet bytes = data.read(65536) ?
Ist bytes eine Build-In Funktion ?
Natürlich kann man die Zeilen 25-30 auch eleganter lösen:
Wie schon am Anfang angesprochen wird irgendwann einmal der Arbeitsspeicher knapp, wenn man versucht von DVD-Images den Hashwert zu berechnen. Daher führt man die Rechnung in Häppchen durch.
Code: Alles auswählen
for block in iter(partial(in_file.read, block_size), b''):
md5.update(block)