Python-Hilfe - wie korrekt anwenden?

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.
Antworten
sfx2k
User
Beiträge: 54
Registriert: Dienstag 2. September 2014, 13:29

Hallo zusammen,

ich habe ein grundlegendes Problem; und zwar weiß ich nicht, wie ich korrekt mit der Python-Hilfe umgehen soll...

Ich wollte mir die Hilfe zu writelines() ansehen.
Wenn ich im Index danach suche, dann bekomme ich folgendes angezeigt:
writelines()
(asyncio.StreamWriter method)
(asyncio.WriteTransport method)
(codecs.StreamWriter method)
(io.IOBase method)
Wenn ich jetzt auf einem Wissensstand von 0 wäre - woher wüsste ich, zu welchem Modul das writelines() folgenden Codes gehört:

Code: Alles auswählen

with open(...) as my_file:
    my_file.writelines(...)
?

Okay, da ich mich schon auf Wissensstand 1 befinde, denke ich mir, dass das zum Modul io gehört.
Also rufe ich den entsprechenden Punkt in der Hilfe auf.
Dieser erklärt mir:
writelines(lines)
Write a list of lines to the stream. Line separators are not added, so it is usual for each of the lines provided to have a line separator at the end.
So, und das war es.
Woher weiß ich, welchem Dateityp lines entspricht?

Nochmal meine beiden Fragen:
1. Woher weiß ich, zu welchem Modul eine Funktion gehört?
2. Woher weiß ich, welchem Typ die Parameter einer Funktion entspricht?

Ich hoffe, die Hilfe und ich werden noch Freunde :D
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

sfx2k hat geschrieben:Woher weiß ich, welchem Dateityp lines entspricht?
Ausprobieren:

Code: Alles auswählen

open("test1.txt", "w").writelines(123)
Fehlermeldung:

Code: Alles auswählen

TypeError: writelines() requires an iterable argument
Nächster Versuch:

Code: Alles auswählen

open("test2.txt", "w").writelines([1,2,3])
Fehlermeldung:

Code: Alles auswählen

TypeError: writelines() argument must be a sequence of strings
Aha, so geht's also:

Code: Alles auswählen

open("test3.txt", "w").writelines(["1","2","3"])
Man kann aber auch help benutzen, das sagt es Dir direkt. In einer Python Shell folgendes eingeben:

Code: Alles auswählen

help(file.writelines)
Ausgabe:

Code: Alles auswählen

Help on method_descriptor:

writelines(...)
    writelines(sequence_of_strings) -> None.  Write the strings to the file.

    Note that newlines are not added.  The sequence can be any iterable object
    producing strings. This is equivalent to calling write() for each string.
a fool with a tool is still a fool, www.magben.de, YouTube
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@sfx2k: Zu 1) In dem Du Dir den Typ von 'my_file' anschaust. Die Dokumentation zu open ist da schon eindeutig:
The type of file object returned by the open() function depends on the mode. When open() is used to open a file in a text mode ('w', 'r', 'wt', 'rt', etc.), it returns a subclass of io.TextIOBase (specifically io.TextIOWrapper).
writelines kommt da in der Dokumentation gar nicht mehr vor. :cry:

zu 2) da lob ich mir die Python 2-Dokumentation
file.writelines(sequence)
Write a sequence of strings to the file. The sequence can be any iterable object producing strings, typically a list of strings. There is no return value. (The name is intended to match readlines(); writelines() does not add line separators.)
@MagBen: Ausprobieren ist immer eine gute Idee, das geht aber nur, wenn man schon eine ungefähre Ahnung hat, wie etwas geht; wild herumraten ist meist wenig zielführend.
sfx2k
User
Beiträge: 54
Registriert: Dienstag 2. September 2014, 13:29

Hallo MacBen,

das ist doch nicht Dein Ernst, oder?

Ich muss durch try'n'error herausfinden, welchen Typ eine Funktion verlangt? :roll:
Da habe ich ehrlich gesagt etwas mehr von einer so populären Sprache erwartet!

Code: Alles auswählen

help(file.writelines)
Das funktioniert bei mir nicht.
Der Aufruf bringt name file is not defined
Zahlreiche andere Schreibweisen funktionieren ebensowenig.
help() bringt mich in eine interaktive Hilfe, aber auch dort heißt es immer nur 'no documentation found for ...'

(Python 3.4)

Edit: mit 2.7.8 funktioniert oben genannter Aufruf.
Danke Sirius für Deine Hints!

Allgemein bin ich da etwas von Python enttäuscht :(
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

@sfx2k

Code: Alles auswählen

with open(...) as my_file:
    help(my_file)
funktioniert prima bei mir ;-)
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

sfx2k hat geschrieben:Ich muss durch try'n'error herausfinden, welchen Typ eine Funktion verlangt?
Du musst nicht, Du kannst.
Die andere Alternative bei Python 2.7 nachzuschauen, weil die Doku bei Python 3 fehlt ist ja auch nicht so doll. Ich denke, das ist eher die Ausnahme, dass Du die fehlende Doku von Python 3 bei Python 2.7 findest.
mcdwerner hat geschrieben:funktioniert prima bei mir
Und was ist die Ausgabe?

Code: Alles auswählen

f = open("test1.txt", "w")
help(f.writelines)
Ausgabe:

Code: Alles auswählen

Help on built-in function writelines:

writelines(...) method of _io.TextIOWrapper instance
Es funktioniert, aber es hilft nicht.
a fool with a tool is still a fool, www.magben.de, YouTube
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

@magben:
die Ausgabe von

Code: Alles auswählen

with open(...) as my_file:
    help(my_file)
ist die gesamte Hilfe zum betreffenden Fileobjekt, u.a. auch zur .writelines() Methode, z.B.:

Code: Alles auswählen

...
writelines(...)
 |      writelines(sequence_of_strings) -> None.  Write the strings to the file.
 |      
 |      Note that newlines are not added.  The sequence can be any iterable object
 |      producing strings. This is equivalent to calling write() for each string.
...
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

@mcdwerner: aber das war für Python 2.7 und bei Python 3 kommt zu writelines nichts Brauchbares.
a fool with a tool is still a fool, www.magben.de, YouTube
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

:shock: gerade an der Stelle hätte ich *keinen* Unterschied zwischen 2 und 3 erwartet :twisted:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sirius3 hat geschrieben: writelines kommt da in der Dokumentation gar nicht mehr vor. :cry:
Eigentlich schon: https://docs.python.org/3/library/io.ht ... writelines

Ok, man muss halt den Weg über ``open`` → ``file object`` → ``io-Module`` gehen. Insbesondere für den zweiten Übergang muss man halt genau lesen:
There are actually three categories of file objects: raw binary files, buffered binary files and text files. Their interfaces are defined in the io module.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@sfx2k: Das Problem ist das Funktionen oft gar keine Typen verlangen und man durch die Angabe eines konkreten Typs in der Dokumentation suggeriert, man könnte nur diesen Typ übergeben. Funktionen wollen in der Regel Objekte mit einem bestimmten *Verhalten*, völlig egal welchen konkreten *Typ* diese Objekte haben. „Duck typing” eben — wenn es quakt wie eine Ente und watschelt wie eine Ente, dann wird das schon was Entenähnliches sein. Die Beschreibung „The sequence can be any iterable object producing strings” stimmt so zum Beispiel nicht, denn es müssen keine Zeichen- oder Byteketten sein, sondern jedes Objekt, egal welchen Typs, welches das „buffer protocol” unterstützt. Numpy-Arrays kann man zum Beispiel auch mit `write()`/`writelines()` direkt schreiben.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

sfx2k hat geschrieben:So, und das war es.
Woher weiß ich, welchem Dateityp lines entspricht?
Ich nehme mal an, dass du "Datentyp" meinst. Die Frage lässt sich nur durch ein wenig Nachdenken und Wissen über die Dokumentation lösen ;-) Prinzipiell lässt sich gar nicht sagen was für Datentypen die Funktion/Methode akzeptiert. Da Python Ducktyping verwendet ist alles zulässig, was dem erwarteten Interface entspricht. Der Name "lines" gibt da aber schon den ersten hinweis. Offensichtlich werden mehrere Zeilen erwartet. Das ist in der Python-Dokumentation immer ein Hinweis auf etwas Iterierbares. Was das alles sein kann, das ist in PEP 234 geregelt.

Nun stellt sich natürlich noch die Frage, welchen Datentyp eine Zeile hat. Da hilft dann ein Blick in die write-Methode der entsprechenden Klasse. Schaut man bei "io.TextIOWrapper" ("_io.TextIOWrapper" ist eine identische C-Implementierung) in die Hilfe, so findet sich keine write-Methode. Dafüber aber in dessen Basisklasse "TextIOBase". Die Hilfe sagt dort:
write(s)
Write the string s to the stream and return the number of characters written.
Eine Zeile entspricht also einem String, bzw. kann alles sein was von "str" erbt.
Das Leben ist wie ein Tennisball.
sfx2k
User
Beiträge: 54
Registriert: Dienstag 2. September 2014, 13:29

Danke für Eure Antworten; muss ich wohl mit zurecht kommen - schaffen andere ja auch :)

@EyDu - natürlich meine ich Datentyp ;)
Antworten