name 'item' is not defined

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.
Milkymalk
User
Beiträge: 12
Registriert: Freitag 11. Mai 2012, 22:22

Ich habe 'has_item' bloß als Funktion geschrieben, weil "if has_item('Seil')" beim Lesen vom Quelltext intuitiv etwas verständlicher ist als "if 'Seil' in player_items". Ich sehe auch die Notwendigkeit von "sauberem" Programmieren, doch wenn ich eine Funktion ohnehin nur als Abkürzung für etwas verwende und sie nicht für verschiedene Zwecke aufgerufen wird, dann erspare ich mir auf Dauer viel Tipparbeit und Parameter, wenn ich keine Argumente übergeben muß.

Eine 'Player'-Klasse anzulegen hat bei nur einer benutzten Instanz keinen Vorteil, da kann ich gleich alle Variablen einzeln ohne Klasse nehmen - das erspart mir, jedesmal 'player.' davorzuschreiben. Gäbe es mehrere Spieler oder Spielfiguren oder auch nur Charaktere, die Items herumtragen können, dann würde ich natürlich eine Klasse anlegen. Tatsächlich haben aber praktisch alle Variablen, die angelegt werden, direkt oder indirekt mit dem Spieler zu tun; andere Entitäten, für die Werte gespeichert werden müssen, kommen nicht vor.
Mir ist klar, daß Klassen eine sehr gute und auch notwendige Möglichkeit sind, Variablen und Funktionen zu sortieren. Aber wozu, wenn es nichts zu sortieren gibt? ;-)

Wahrscheinlich klinge ich gerade furchtbar unbelehrbar - tatsächlich ist mir aber daran gelegen, die Variablenaufrufe möglichst einfach zu halten, weil die Zeilen, in denen sie verwendet werden, tendenziell sehr lang und unleserlich werden können.
BlackJack hat geschrieben:Bei Werten kennen Wörterbücher keine Beschränkungen. Das können beliebige Objekte sein. Statt Namen auf Zahlen abzubilden könntest Du auch Namen auf `Item`-Exemplare abbilden.
Hyperion hat geschrieben:

Code: Alles auswählen

# Dict-Comprehension erst ab Python 3.x
# Du musst es in etwa so umsetzen: shop = dict((name, ...) for ...)
shop = {name: Item(name, cost) for name, cost in ITEMS.items()}
Ah, das ist ja praktisch! Aber das Wörterbuch muß ich dann wie hier anlegen, das kann ich nicht einfach hinschreiben nehme ich mal an :-)
So wie ich das verstehe ist das gezeigte Beispiel eine Dict-Comprehension. Also muß ich auf die dict()-Funktion ausweichen, weil ich nur eine 2.x-Umgebung habe. Verstanden.

Nochmal vielen Dank für die umfangreiche und geduldige Hilfe :)
Benutzeravatar
pillmuncher
User
Beiträge: 1532
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Milkymalk hat geschrieben:So wie ich das verstehe ist das gezeigte Beispiel eine Dict-Comprehension. Also muß ich auf die dict()-Funktion ausweichen, weil ich nur eine 2.x-Umgebung habe. Verstanden.
Verstanden? Fast, aber nicht ganz:

Code: Alles auswählen

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> {b:a for a, b in enumerate('hallo')}
{'a': 1, 'h': 0, 'l': 3, 'o': 4}
Außerdem gibt es keine Variablenaufrufe, nur Funktionsaufrufe.

[edit]oops! Falschen Code kopiert. Jetzt stimmt's.
Zuletzt geändert von pillmuncher am Mittwoch 16. Mai 2012, 22:30, insgesamt 1-mal geändert.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@Milkymalk: Also ich sehe auch bei einem Spieler einen Sinn eine Klasse anzulegen um darin alle zu ihm gehörenden Daten zu speichern. Bei `has_item()` sagst Du es dient der Lesbarkeit; das gleiche kann man doch auch für ein Player-Objekt sagen, denn ein ``player.has_item('Parrot')`` vermittelt dem Leser die Zusatzinformation worauf sich die Funktion/Methode bezieht. Bei so etwas ist Tipparbeit zu sparen IMHO auch kein gutes Argument, denn es sollte da eher zählen was einem beim Lesen mehr bringt. Quelltext wird deutlich öfter gelesen als geschrieben. Und da heute selbst die einfachen Texteditoren Autovervollständigung anhand des bereits vorhandenen Textes im Dokument bieten, ist es auch nicht so viel Mehraufwand.
Antworten