Wer lügt? IDLE oder PyCharm?

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
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute, ich arbeite ziemlich gerne mit PyCharm. Jedoch habe ich gestern per Zufall etwas merkwürdiges entdeckt. Ich habe mit der uuid4 herumgespielt. Ich stelle euch mal den kurzen und knappen Quelltext vor:

Code: Alles auswählen

import uuid

    def generate_uuid4(self):
        return uuid.uuid4().hex

    def get_uuid4(self):
        var_uuid = generate_uuid4()
        self.ui_pp_movie.lineEdit.setText(var_uuid)
In meiner "Spielerei" wollte ich, dass die uuid4 auf der GUI in einem lineEdit-Widget ausgegeben wird - nichts Spektakuläres. Starte ich meine Anwendung mit PyCharm, bekomme ich folgende Fehlermeldung, und aber die Anwendung wird nicht abgebrochen:
AttributeError: 'NoneType' object has no attribute 'hex'
Gut dachte ich, irgendwas mache ich falsch - wie immer. Später irgendwann startete ich meine Anwendung, mit dem gleichen Code über IDLE, denn ich wollte nicht ewig warten bis PyCharm gestartet ist. Und siehe da, IDLE wirft keine Fehler und führt die Funktion so aus, dass ich am Ende den generierten UUID in meinem lineEdit-Widget zusehen bekomme.

Frage nun, wer sagt die "Wahrheit"? IDLE meckert an dieser Stelle kein Bisschen und Pycharm regt sich darüber auf.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Verwendest du die gleiche Python-Version in PyCharm und IDLE?

Lass mal zu Debug-Zwecken folgendes Programm laufen und vergleiche.

Code: Alles auswählen

import uuid
print(uuid.__file__)
print(type(uuid.uuid4()))
Mir ist allerdings unklar warum dein Programm einen Fehler werfen sollte ohne abzubrechen. Da ist dann wohl doch noch etwas mehr Code involviert.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@/me: Ich verwende PyCharm 3.4.1, die Community Edition, und arbeite mit Python 2.7.6, demzufolge ist meine IDLE auch die Version 2.7.6

Und nein, er zeigt genau auf die Zeile. In meinem Quelltext wird die eine Funktion aufgerufen, die wiederum die andere Funktion aufruft, um die uuid4 zu bekommen. Also keine Verstrickung etc.

Ich werde gleich mal den Quelltext ausgeben.

EDIT: Sowohl im PyCharm als auch im IDLE wird folgendes ausgegeben:
C:\Python27\lib\uuid.pyc
<class 'uuid.UUID'>
BlackJack

@Sophus: Es ist wenig sinnvoll hier irgendwelche Fehler zu raten zu denen wir weder den Quelltext noch den vollständigen Traceback kennen. Der Quelltext im ersten Beitrag ist nicht ”echt” denn in `get_uuid4()` wird die *Funktion* `generate_uuid4()` aufgerufen die wir nicht kennen, denn Du zeigst da nur eine *Methode* mit dem Namen. Also wenn man mal davon ausgeht das Einrückung und `self` diese Bedeutung haben. Sicher sein können wir *da* ja auch nicht.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Wie ich schon sagte, ist da keine Verstrickung vorhanden. Aber ich präsentiere mal den Quelltext:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import os
import sys

import uuid

from PyQt4.QtGui import QDialog, QIcon, QLineEdit
from PyQt4.uic import loadUi


class Movie_Window(QWidget):
    def __init__(self, parent):
        QWidget.__init__(self, parent)

        self.getPath_movie_form = os.path.join(os.path.abspath("."), 'files', "qt_ui", 'pp_movie.ui')

        self.ui_pp_movie = loadUi(self.getPath_movie_form, self)

        self.get_uuid()

    def generate_uuid4(self):
        return uuid.uuid4().hex

    def get_uuid(self):
        var_uuid= self.generate_uuid4()
        self.ui_pp_movie.lineEdit.setText(var_uuid)
Sobald also die Klasse (es handelt sich hierbei um ein Unterfenster) geladen wird, soll die get_uuid-Funktion aufgerufen werden. Diese Funktion ruft dafür die generate_uuid4-Funktion auf, um die uuid zu bekommen, die dann in der var_uuid-Variable gespeichert werden soll. Und dann soll die uuid über QlineEdit ausgegeben werden.

Hier der vollständige TraceBack:
Traceback (most recent call last):
File "D:\Dan\Python\project_xarphus\files\modules_ui\ui_pp_mdi.py", line 285, in create_movie_form
f8da93b2-9d2d-4c27-96ff-bc8304818e51
self.movie_form = Movie_Window(self.close_sub_form, self.subwindow_movie, self)
File "D:\Dan\Python\project_xarphus\files\modules_ui\ui_pp_movie.py", line 57, in __init__
self.get_uuid()
File "D:\Dan\Python\project_xarphus\files\modules_ui\ui_pp_movie.py", line 83, in get_uuid
var_uuid = self.generate_uuid4()
File "D:\Dan\Python\project_xarphus\files\modules_ui\ui_pp_movie.py", line 79, in generate_uuid4
return uuid.uuid4().hex
AttributeError: 'NoneType' object has no attribute 'hex'
Jedoch wird diese Fehlermeldung nur über PyCharm ausgegeben. IDLE führt die Funktion problemlos aus - ohne Anzeichen von Fehlermeldungen. Und ich verwende nur Python 2.7.6, falls der Verdacht aufkommt, dass ich mehrere Python-Versionen auf meinem Laptop habe. Ich bin auch soweit gegangen, und habe die Anwendung in eine EXE-Datei umgewandelt und anschließend ausgeführt. Wenn Fehler auftauchen, wird automatisch eine Log-Datei in Form einer TXT-Datei angelegt. Tut die Anwendung nicht. Also scheint alles "sauber" zu sein. Nur was mich hierbei nervt, ist, dass ich weiterhin mit PyCharm arbeiten will. Wenn er aber hierbei stehen bleibt, und die Funktion nicht ausführt, jedoch die Anwendung nicht abbricht, dann wird es schwierig mit PyCharm weiter zu arbeiten.
Antworten