print-Anweisung zeitgleich in Tex-Widget umleiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Max77
User
Beiträge: 19
Registriert: Samstag 30. April 2016, 13:42

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 ?
BlackJack

@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.
Max77
User
Beiträge: 19
Registriert: Samstag 30. April 2016, 13:42

@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
BlackJack

@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?

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
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:

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
`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.
Max77
User
Beiträge: 19
Registriert: Samstag 30. April 2016, 13: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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

In os.walk() werden die Tupel erstellt. Wie genau das passiert kannst du nachlesen.
BlackJack

@Max77: Die Tupel werden von `os.walk()` erstellt und geliefert:

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
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.)
Max77
User
Beiträge: 19
Registriert: Samstag 30. April 2016, 13:42

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 ?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Natürlich kann man die Zeilen 25-30 auch eleganter lösen:

Code: Alles auswählen

            for block in iter(partial(in_file.read, block_size), b''):
                md5.update(block)
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.
Antworten