Korrekter Weg um stdout stummzustellen

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 4. November 2008, 15:43

snafu hat geschrieben:Und wenn ich dann auch nochmal meinen Senf dazu geben darf: Ich denke nicht, dass man bei der Wahl von Variablen-Namen halbe Romane schreiben muss (bytes_loaded, incoming_data).

Ich halte das für durchaus sinnvoll. Variablennamen dokumentieren den Code so dass sie das Verständnis des Codes ermöglichen, nicht dass das Verständnis des Codes nötig ist, um die Motivation hinter den Variablennamen zu verstehen. Siehe Kenny Tiltons Gedanken zu AA, BB, CC & DD. AA ist natürlich schon übertrieben, aber der Hauptgedanke kommt IMHO rüber.

Hrhr, ich wollte schon immer mal kzo zitieren.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
snafu
User
Beiträge: 5427
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 4. November 2008, 16:29

Den Artikel kenne ich schon und ich bin ja auch dafür, aussagekräftige Namen zu verwenden. Aber bei so einem kleinen Skript wie in dem Beispiel, finde ich, dass schon klar ist, woher "data" kommt. Ich will jetzt auch nicht drauf rumreiten. Falls du dich jetzt auf ein größeres Projekt beziehst, so denke ich, dass "data" und "incoming_data" in etwa die selbe Aussagekraft haben. Wenn ich explizit unterscheiden müsste zwischen Daten von einer Webseite, Nutzereingaben und Informationen aus einer Datei, wäre IMHO sowas in der Art passender: "site_data", "user_input", "file_content" (in allen drei Fällen kommen gewissermaßen Daten herein, aber die kommen ja eigentlich immer herein, wenn man sie nicht gerade selbst definiert). Der "halbe Roman" war eher so gemeint, dass man nicht unbedingt ins Detail bei der Benennung (respektive: Beschreibung) einer Variable gehen muss, wenn es für das Verständnis des Codes eher unnötig ist. Denn ich finde wie gesagt, auch ein Außenstehender wird nicht tagelang grübeln müssen, wenn er eine Download-Funktion sieht, die an "data" gebunden ist und mit der wiederum zwei Zeilen tiefer etwas anderes gemacht wird. 30 Zeilen tiefer wäre es natürlich etwas anderes, aber eigentlich versucht man ja, möglichst "ortsnah" mit seinen Variablen zu arbeiten...
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Dienstag 4. November 2008, 16:41

HWK hat geschrieben:@YOGi: outfile in Zeile 20 soll doch sicher filename sein?

Jup, klaro. Danke.


snafu hat geschrieben:Es wird ja ein Generator durch yield erzeugt und dann ruft map immer f.write() auf, wenn ein neues MB dazukommt, richtig?

Richtig.

snafu hat geschrieben:Und BUFFER_SIZE könnte man wie ich finde genau so gut als Keyword-Argument mit nem Standardwert von 1MB an die Funktion übergeben.

Klar, das ist sicher eine gute Idee. Hast du aber nicht gemacht, sondern den Wert mitten im Funktionsrumpf hardkodiert ;)

snafu hat geschrieben:Ich denke nicht, dass man bei der Wahl von Variablen-Namen halbe Romane schreiben muss (bytes_loaded, incoming_data).

Jein. `loaded` hört sich für mich von der Namensgebung zu allererst mal nach einem Namen für einen Boolean an. Da ich also auf Anhieb verwirrt war, habe ich ihr einen - wie ich finde - etwas unmissverständlicheren Namen gegeben.
`incoming_data` muss nicht sein, aber `data` war mir auch zu doof, da es eigentlich rein gar nichts aussagt. Ich hätte vielleicht `download` verwendet, aber so heißt ja die Funktion bereits (und da deren Name ein Verb ist [nur leider auch ein Nomen], ist er an sich eine gute Wahl).

snafu hat geschrieben:Zudem sollte man konsequenterweise "temp" in "buffer" umbenennen, wenn man weiter oben auch BUFFER_SIZE sagt.

Auch richtig. Aber ich kann dir ja nicht *alles* hinterher tragen, oder? ;)
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Beitragvon str1442 » Dienstag 4. November 2008, 16:52

Code: Alles auswählen

Python 2.5.2 (r252:60911, Sep 29 2008, 21:15:13)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> buffer
<type 'buffer'>
Benutzeravatar
snafu
User
Beiträge: 5427
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 4. November 2008, 16:56

Naja, für die Daten, die man hat, würde ich dann eher das Präteritum "downloaded" verwenden.

@str1442: Danke, das habe ich gar nicht bedacht. Na, dann "buf" oder sowas. Oder halt einfach bei "temp" bleiben. :)

EDIT: Und an der Stelle von "data" vielleicht eher sowas wie "url", falls der Name den tatsächlich so schlecht sien sollte. Selbst wenn auch dies wohl auch nicht hundertprozentig passt. In solchen Fällen schreibe ich dann aber lieber was hin, als mir stundenlang Gedanken um den perfekten Namen zu machen, wenn ich ehrlich bin. Manchmal lese ich mir das auch ein paar Tage später nochmal durch und habe dann den Geistesblitz. ;)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 4. November 2008, 18:58

snafu hat geschrieben:Naja, für die Daten, die man hat, würde ich dann eher das Präteritum "downloaded" verwenden.

Warum sollen denn Daten an ein Verb im Präteritum gebunden werden. Konsequent angewandt würden dann so ulkige Sachen wie ``instantiated = ElaborateClassName()`` raus kommen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
snafu
User
Beiträge: 5427
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 4. November 2008, 19:04

Meinst du, sowas wie "begin_from" würde hier eher passen? Im Grunde sage ich damit ja dem Server, ab wo er den Download starten soll. Andererseits bezeichnet es aber auch die Bytes, die vom letzten Mal schon da sind. Obwohl, an sich wäre "begin_from" vielleicht echt das Beste. Oder vielleicht auch "start_at_byte"...
BlackJack

Beitragvon BlackJack » Dienstag 4. November 2008, 20:03

Ich schmeisse mal 'offset' oder 'start_offset' in den Ring. :-)
lunar

Beitragvon lunar » Dienstag 4. November 2008, 20:15

Es ist schon bezeichnend, wenn man über die Namensgebung in der Lösung fast schon länger diskutiert als über das eigentliche Problem ...
Benutzeravatar
snafu
User
Beiträge: 5427
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 4. November 2008, 20:16

"Offset" meint doch eher "Abweichung"...

Aha, "remaining" vielleicht? :)
Benutzeravatar
snafu
User
Beiträge: 5427
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 4. November 2008, 20:18

lunar hat geschrieben:Es ist schon bezeichnend, wenn man über die Namensgebung in der Lösung fast schon länger diskutiert als über das eigentliche Problem ...


Warum? Das ist doch bereits gelöst.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Dienstag 4. November 2008, 20:43

`offset` gefällt mir auch (hatte `start` oder `start_at` im Sinn, aber Letzteres ist mehr ein Name für ein Datenbank-Feld), aber `url` für `data`? Wie wäre es mit `content`? :) `received` ginge ähnlich `downloaded` auch - beides könnte aber auch die Menge in Bytes oder ein Boolean (ja, ok) sein. Passend wäre dann wieder `received_data` oder `data_downloaded`. Und das ist dann von meinem Erstvorschlag auch nicht mehr weit entfernt.

lunar: Gute Namenwahl macht guten Programmcode aus, warum sollte man da nicht ausführlich drüber elaborieren? Wo lernt man es sonst?
BlackJack

Beitragvon BlackJack » Dienstag 4. November 2008, 21:05

@snafu: "offset" würde ich in diesem Fall als "Versatz" übersetzen. Das ist der technische Begriff der für so etwas in der Informatik verwendet wird. Eine Anzahl Bytes oder Elemente, die zu einem bestimmten Index dazu gezählt wird. Wenn kein Index angegeben wird, dann ist in der Regel der Anfang gemeint.
Benutzeravatar
snafu
User
Beiträge: 5427
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 4. November 2008, 21:05

"content" ist gut. Und eigentlich nehm ich das auch immer, fällt mir gerade ein. ^^
Benutzeravatar
snafu
User
Beiträge: 5427
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 4. November 2008, 21:08

BlackJack hat geschrieben:@snafu: "offset" würde ich in diesem Fall als "Versatz" übersetzen. Das ist der technische Begriff der für so etwas in der Informatik verwendet wird. Eine Anzahl Bytes oder Elemente, die zu einem bestimmten Index dazu gezählt wird. Wenn kein Index angegeben wird, dann ist in der Regel der Anfang gemeint.


Achso, das war mir nicht bekannt. Bin ja eigentlich nicht vom Fach. Gut, dann weiß ich ja jetzt welche beiden Sachen ich nehme. Und an die Funktion werde ich "bufsize" übergeben, würd ich sagen.

Code: Alles auswählen

from __future__ import with_statement
from os.path import getsize
from urllib2 import Request, urlopen

def download(url, outfile, bufbytes=1048576):
    with open(outfile, 'a') as f:
        offset = getsize(outfile)
        request = Request(url)
        request.add_header('Range', 'bytes=%d-' % offset)
        content = urlopen(request)
        while True:
            buf = content.read(bufbytes)
            if buf == '':
                break
            f.write(buf)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder