__trunc__???

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
ivy1991
User
Beiträge: 6
Registriert: Montag 16. Juli 2012, 11:22

Hallo!

Ich programmiere jetzt schon ziemlich lange in Python und bin heute auf folgenden Fehler gestoßen:

Code: Alles auswählen

AttributeError: class instance has no attribute __trunc__
Ich hab hier zwar schon was gefunden und dort stand nur in der Art: Wenn das steht, gehts nicht.
Damit geb ich mich aber nicht zufrieden :D

Woher kommt dieser Fehler und wie kann man ihn lösen?
Der Code stimmt zumindest gibt mir meine IDE (Komodo) keinen Fehler aus... Nur wenn ich den Code ausführen will (sprich die Klasse in meinem eigentlichen Programm aufrufe), kommt der oben genannte Fehler...
BlackJack

@ivy1991: Irgendwo wird bei irgend einem Objekt die Methode `__trunc__()` erwartet, aber das Objekt hat diese Methode offenbar nicht.

Die Methode wird zum Beispiel von math.trunc() aufgerufen.
ivy1991
User
Beiträge: 6
Registriert: Montag 16. Juli 2012, 11:22

Ich übergebe meiner Klasse eine Anzahl von Parametern.
Einer davon ist ein String und alle anderen sind int bzw. float-Werte.

Kann da das Problem liegen?
Weil wenn ich das jetzt beim schnellen drüberlesen richtig verstanden habe, geht es wohl darum, dass irgendein Wert nicht in eine Zahl umgewandelt werden kann (was ja bei String absolut der Fall ist :D )
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

ivy1991 hat geschrieben:Der Code stimmt zumindest gibt mir meine IDE (Komodo) keinen Fehler aus... Nur wenn ich den Code ausführen will (sprich die Klasse in meinem eigentlichen Programm aufrufe), kommt der oben genannte Fehler...
Statische Analyse ist in Python (leider) kaum existent, also Verlass dich nicht auf die Ausgabe von Tools.

Zeige den kompletten Traceback und den relevanten Code oder wir muessen weiter orakeln.

P.S. Willkommen im Forum!
ivy1991
User
Beiträge: 6
Registriert: Montag 16. Juli 2012, 11:22

okay, ich stell mal die relevante Klasse rein. Database ist meine Klasse, von der ich in weitere Folge Daten bekommen soll.
Name ist ein String - alles andere Integer-Werte bzw. float-Werte
Zuletzt geändert von ivy1991 am Dienstag 17. Juli 2012, 09:04, insgesamt 1-mal geändert.
BlackJack

@ivy1991: Ich sehe nicht wo da die Ausnahme auftreten könnte, ausser vielleicht in `Database()` oder `db.getDataTest()`. Für beide Aufrufe ist aber der Rest des Quelltextes irrelevant. Und welcher von den beiden Aufrufen es ist/war müsste man nicht raten, wenn Du einen kompletten Traceback zeigen würdest.

Dafür sehe ich einen Sternchen-Import und unpythonische Namen und vor allem Getter-Methoden.

Wegen der Namen und der Einrückung: PEP 8 -- Style Guide for Python Code.

Diese Unterstriche an Attributen solltest Du sein lassen. Was soll das? Dass es ein Attribut ist — sein muss — sieht man schon daran, dass über `self` darauf zugegriffen wird.
ivy1991
User
Beiträge: 6
Registriert: Montag 16. Juli 2012, 11:22

zu den Namensgebungen: Ich habe da Vorgaben von meinen Lehrern (tja... manchmal sinds nicht die besten). Die Unterstriche sollen "private" Variablen darstellen...

Nachdem ich endlich gecheckt habe, woher ich das Traceback bekomme, bin auch relativ schnell auf den Fehler gekommen...
Und der Fehler war ein winziger Fehler in einer der Abfragen-Statements... Also, dort: db.getDataTest(self)
ivy1991
User
Beiträge: 6
Registriert: Montag 16. Juli 2012, 11:22

Danke für die Hilfe ;)
BlackJack

@ivy1991: Dann sind die Unterstriche an der falschen Stelle — die gehören *vor* den Namen. Ich würde Vorgaben von Lehrern ignorieren die der offiziellen Dokumentation der Sprache widersprechen, wenn sie die nicht *gut* begründen können.

Letztendlich sind es aber keine „privaten” Attribute weil ja für jedes mindestens ein Getter existiert, also offenbar mindestens Lesezugriff von aussen vorgesehen. Das man sie nicht schreiben darf, kann man auch durch Dokumentation erreichen, die das aussagt. Mehr ist ein führender Unterstrich ja auch nicht. Man spart sich dadurch dann aber eine Menge „boiler plate”-Quelltext.

Das erstellen eines `Database`-Exemplars und die `getDataTest()`-„Methode” die semantisch gar keine Methode darstellt, ist ein sehr fragwürdiger Entwurf. Der Name `getDataTest()` suggeriert zudem das es da einen Rückgabewert gibt, was offensichtlich nicht stimmt. In Python sähe das Ganze eigentlich so aus:

Code: Alles auswählen

from Database import Database


db = Database()

# 
# TODO Translate class' name to english.
# 
class Produktion(object):
    def __init__(
        self, name, order_id, product_id, product_name_id, nominal_weight_id
    ):
        self.name = name
        self.order_id = order_id
        self.product_id = product_id
        self.product_name_id = product_name_id
        self.nominal_weight_id = nominal_weight_id

    @staticmethod
    def data_test():
        db.getDataTest()        # XXX Why ignore return value here?
Immer noch unter dem Vorbehalt, dass ich nicht überzeugt bin, dass `data_test()` tatsächlich in die Klasse gehört.

Ich hoffe mal die Klasse `Produktion` ist nicht das einzige was in einem Modul mit dem gleichen Namen steckt und im Modul `Database` gibt es nicht nur eine Klasse `Database`. Wenn man pro Modul grundsätzlich nur eine Klasse hat, dann macht die Organisationseinheit „Modul” überhaupt keinen Sinn. Das hier ist Python und nicht Java.
Antworten