Krautkanal.com

Veröffentlicht am 2015-07-19 22:14:55 in /prog/

/prog/ 7438: Zu Hilf Bernd! Ich arbeite mich gerade durch "L...

alexradsby Avatar
alexradsby:#7438

Zu Hilf Bernd!

Ich arbeite mich gerade durch "Lerne Python den harten Weg" Learn Python the hard Way1. Fassung. Die 3. Fassung habe ich inzwischen auch, würde aber erstmal gerne diese Aufgabe lösen, bevor ich mit dem neueren Buch weitermache. und stecke fest bei Aufgabe 43.

Es geht darum ein kleines Textabenteuer mit Klassen zu programmieren. Im Prinzip habe ich schon ein funktionierendes Programm ("ex43b.py"). Darin ist fast das ganze Spiel in einer Klasse mit dem Namen "Spiel" enthalten. Das Buch will aber, dass ich für jeden Raum im Spiel eine eigene Klasse erstelle.

Das versuche ich in "ex43c.py". Jeder Raum hat dabei eine Methode "ablauf", diese soll in der Hauptschleife des Spiels ("spiel.spielen") aufgerufen werden und als Rückgabewert den Namen des nächsten Raumes liefern, dessen "ablauf" dann wiederum von der Hauptschleife aufgerufen werden soll.

Im Prinzip funktionierte das in "ex43b.py" schon genauso. Jetzt schaffe ich es in "ex43c.py" aber nicht, in der Hauptschleife die Methode "ablauf" aus einem anderen Objekt aufzurufen. ("ex43c.py" ab Zeile 25)

Vielleicht kannst du ja einer armen Python-Biene helfen, Halsbart-Bernd. Es liegt doch bestimmt nur an einer blöden Kleinigkeit, oder...?

sindresorhus Avatar
sindresorhus:#7440

Die Fehler liegen darin, dass du immer Strings zurückgibst und nicht Raumobjekte. Das kommt mehrere Male vor. Genauso gibst du an anderen Stellen "Tod" zurück anstatt die Todmethode deines Spiels aufzurufen.
Ansonsten hüllen wir mal den Mantel des Schweigens darüber.

turkutuuli Avatar
turkutuuli:#7441

> Die Fehler liegen darin, dass du immer Strings zurückgibst und nicht Raumobjekte
Das versuche ich doch mit getattr() zu ändern, klappt aber nicht. In der Version b ging es ja auch.

> Ansonsten hüllen wir mal den Mantel des Schweigens darüber.
Wenn du damit die Handlung meinst, ok :3

Chakintosh Avatar
Chakintosh:#7442

>>7441
In der Version b ging es, weil es ja schon eine Instanz des Spiels gibt, wo dann die Attribute bestimmt werden können.
In Version c gibt es ja aber noch gar keine Instanz des Raums, wenn du den Aufruf machst.
Wenn du das so beibehalten willst, musst du aus dem String dann schon vorher noch ein Objekt erstellen z.B. getattr(sys.modules[__name__], str)

mbilalsiddique1 Avatar
mbilalsiddique1:#7443

>>7442
Aber ich habe doch Zeile 118:
dieser_raum_0 = raum_0()
Das erzeugt doch eine Instanz von raum_0. Gut, es ist nicht sehr elegant und die anderen Räume fehlen natürlich noch, aber raum_0 müsste doch als dieser_raum_0 erstmal laufen.

yesmeck Avatar
yesmeck:#7447

So, jetzt läuft es immerhin wieder. Die hartkodierten Objektnamen erscheinen mir etwas krebsig. Vielleicht finde ich ja noch eine bessere Lösung, aber ich glaube, ich sollte erstmal weiterlernen. Danke für deine Tipps, Bernd!

mrxloka Avatar
mrxloka:#7566

Hallo /prog/-Bernd, ich bin's wieder, deine leidgeplagte Python-Neubiene.

Ich leide nicht unter Python, sondern unter meinem Lehrbuch. Ich bin umgestiegen von "Learn Python the Hard Way 1.0" auf "Learn Python the Hard Way 3.0". Der Autor Zed Shaw hat mich viel gelehrt, aber er quält mich auch und zwar völlig unnötig. Ich bin nun zu Kapitel 46 vorgedrungen und fühle mich ganz und gar im Stich gelassen.

Hier kannst du das Kapitel ansehen, Bernd: http://learnpythonthehardway.org/book/ex46.html

Da soll ich einen Haufen Zeug installieren, namentlich pip, distribute, nose, virtualenv. Gut, das ist mir noch gelungen. Als nächstes soll ich "nachlesen, wie der ganze Kram funktioniert, den du gerade installiert hast". WZF, wäre es nicht die Aufgabe des Autors mir dazu etwas zu sagen? Ich habe schon ein paar Infos gefunden, aber weiß noch nicht so recht, wie das alles zusammenhängt. Kennst du eine gute Seite dazu?

Fürderhin soll ich ein Grundgerüst ("skeleton") für kommende Projekte anlegen, das folgenden Aufbau besitzt:

> Projekt Skelett:
> bin docs NAME setup.py setup.py~ tests

> Projekt Skelett/bin:

> Projekt Skelett/docs:

> Projekt Skelett/NAME:
> __init__.py __init__.pyc

> Projekt Skelett/tests:
> __init__.py __init__.pyc NAME_tests.py NAME_tests.py~ NAME_tests.pyc

Im Buch findet sich kein Satz dazu, wie die einzelnen Verzeichnisse zusammenspielen sollen. Es gibt zwar einen Verweis auf ein Beispielprojekt des Autors https://
gitorious.org/python-modargs, aber der Inhalt ist nicht verfügbar.

Auf dieser Grundlage soll ich nun ein "Projekt erstellen", "Code ins Modul einfügen" und "das Modul zum Laufen bringen". Dazu kommen noch weitere Aufgaben zu denen ich keinen Zugang finde, "Skripte installieren" zum Beispiel.

Ich bin mit den Aufgaben im Buch bisher ganz gut zurechtgekommen, aber gerade fühle ich mich verarscht. Kannst du mir diese Sachen erklären Bernd, oder weißt du, wo sie gut erklärt werden? Vielleicht kennst du ja auch ein besseres Buch, um Python zu lernen. Es hat zwar bisher Spaß gemacht mit Zed Shaw, aber langsam habe ich die Nase voll.

Der Vollständigkeit halber füge ich die letzte Version meines pubertären, obszönen und durchaus verwerflichen Textabenteuers bei. Ich denke, dass sie schon besser ist als das, was ich vorher zusammengeschustert habe.

hibrahimsafak Avatar
hibrahimsafak:#7574

>>7566
Ein modul ist eine Datei erst mal.

import foo # importiert foo.py oder foo/__init__.py

Ein untermodul ist foo/bar.py wenn es foo/__init__.py gibt (gerne auch leer)

das geht auch verschachtelt. und foo/__init__.py kann "import bar.py" machen, muss aber nicht.

nehemiasec Avatar
nehemiasec:#7575

Und du kannst dir Rosinen rauspicken.

from datetime import timedelta # datetime.datetime will ich gar nicht

kamal_chaneman Avatar
kamal_chaneman:#7576

>>7575
Oder Berndstyle alles vollsprotzen:
from modul import *

RussellBishop Avatar
RussellBishop:#7579

>>7438
/r/ das Buch

buleswapnil Avatar
buleswapnil:#7590

>>7579
http://learnpythonthehardway.org/book/

nehemiasec Avatar
nehemiasec:#7591

>>7590
> Make sure you install Python 2 not Python 3.
Ich habe gerade verstanden, warum das Buch den Titel "Learn Python the Hard Way" trägt.

iamkarna Avatar
iamkarna:#7592

>>7591
Ich sah was du tatest

hoangloi Avatar
hoangloi:#7599

>>7574
> Ein modul ist eine Datei erst mal.
Ok, das kenne ich ja schon. Ein Modul enthält Code, den ich bei Bedarf in mein Programm importieren kann. Jetzt verstehe ich nur nicht, was an dieser Stelle im Buch damit gemeint ist. Die Module mit dem auszuführenden Code gehören wohl in den Order Projektordner/Projektname/, oder?

Kann man die Ordnerstruktur, die ich in
>>7566
als Grüntext gepostet habe, so verpacken, dass die Ordner samt Inhalten wieder eine Art Modul bilden? Hat das vielleicht etwas mit Python-Eggs zu tun?

Im Buch klingt es auch so, als sei ein "Projekt" irgendeine spezielle Form von Programm, das man auf eine besondere Weise "zum Laufen bringen" könnte. Ist das so oder soll ich vielleicht einfach nur Code ausführen, der in diesen Ordnern enthalten ist?

Und was ist mit "Skript installieren" gemeint? Ein Skript ist doch eine Textdatei mit Code, die ich mir irgendwo abspeichere und bei Bedarf ausführe. Was soll ich da installieren?

Ich hoffe meine Fragen sind nicht zu blöd. Ich verstehe leider noch gar nicht, was diese ganze Übung eigentlich soll. Vielleicht ist das auch eine schlecht geschriebene Stelle, an der man die nächste Übung machen muss, um die aktuelle Übung zu verstehen. Das werde ich noch versuchen, wenn hier jetzt niemand weiterweiß.

>>7579
Hab's angehängt. Für weitere Buchempfehlungen bin ich offen. Es sollten aber viele praktische Übungen drin sein.

wtrsld Avatar
wtrsld:#7759

>>7599
Ein Projekt im Sinne wie "Modul" gibt es bei Python nicht, vermutlich bieten dir verschiedene IDEs aber an ein Projekt zu haben und denken sich eine Struktur dazu aus.

Prinzipiell ist der einfache Einstieg eine Flache Struktur:

meinprogramm/programm.py
meinprogramm/modul_mit_funktionenA.py
meinprogramm/modul_mit_funktionenB.py

Das kann irgendwann ausgeweitet werden mit Kram wie:

meinprogramm/io/__init__.py
meinprogramm/io/file.py
meinprogramm/io/http.py

Wenn dein Projekt größer wird hast du eventuell eine dicke Lib mit Funktionen und ein paar Programme, die sie nutzen:

meinprogramm/programm/programm.py
meinprogramm/programm/modul_mit_funktionenA.py
...
meinprogramm/bin/nuetzliches_tool.py # importiert programm.programm

Beim ausführen musst du normalerweise nur "python nuetzliches_tool.py" machen, ggf muss PYTHONPATH passend gesetzt sein. Ein virtualenv hilft hier und richtiges Paketieren.

Dazu baust du dein Paket so:
https://pythonhosted.org/an_example_pypi_project/setuptools.html

Die Struktur wäre dann:
meinprogramm/setup.py
meinprogramm/programm/programm.py

und "python setup.py sdist" erstellt dir z.B. ein sourcepaket was installiert werden kann.
Hast du das Projekt erst mal so, dass es funktioniert kannst du es mit "pip -e /path/to/project" installieren. -e meint editierbar, d.h. der Projektordner wird verwendet, statt die Dateien zu kopieren (sodass du es jedes Mal neu installieren müsstest)

Statt das Systemweit zu machen, nimm ein virtual environment:

$ virtualenv venv
$ cd venv
$ source bin/activate
(venv) $ pip -e install meinprogramm/
$ find /home/user/venv/lib # du siehst paar pythonlibs und einen symlink zu /home/user/venv/meinprogramm

http://docs.python-guide.org/en/latest/dev/virtualenvs/

Neuste Fäden in diesem Brett: