Anzeige:
Ergebnis 1 bis 14 von 14

Thema: Python3 int oder nicht int fu

  1. #1
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.243

    Python3 int oder nicht int fu

    Hi,

    mal wieder iene Python3 Frage, ich komme mit den Variablen Typen nicht klar
    Ich erzeuge beim parsen eines Logs eine Variable die int sein sollte
    Code:
    .
    .
    .
          VertragTmp = int(line.split(';')[11])
    .
    .
    .
          VertragTmp = VertragTmp * 100 + 2
    Bei der anschliessenden Berechnung "2652367598 * 100 + 2" bekomme ich jedoch den Fehler

    Code:
    VertragTmp = VertragTmp * 100 + 2
    TypeError: Can't convert 'int' object to str implicitly
    Nach dem Erzeugen der Variable ein Type(VertragTmp), da zuerst dieser Fehler bemaengelt wird

    Gruss Stefan
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  2. #2
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.814
    Code:
    line = '1;2;3;4;5;6;7;8;9;10;11;2652367598'
    VertragTmp = int(line.split(';')[11])
    VertragTmp = VertragTmp * 100 + 2
    print('%s (%s)' % (VertragTmp, type(VertragTmp)))
    VertragTmp = 'foo' * 100 + 2
    print('%s (%s)' % (VertragTmp, type(VertragTmp)))
    
    '''
    ergibt diese Ausgaben:
    265236759802 (<class 'int'>)                                                                                                                                                                                                                           
    Traceback (most recent call last):                                                                                                                                                                                                                     
      File "main.py", line 6, in <module>                                                                                                                                                                                                                  
        VertragTmp = 'foo' * 100 + 2                                                                                                                                                                                                                       
    TypeError: Can't convert 'int' object to str implicitly
    '''
    
    Klar was ich meine, oder?

    [edit]Komma oder sonstiges Zeichen dran geschlichen?
    Geändert von nopes (29.11.16 um 12:55 Uhr)
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  3. #3
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.243
    Das Problem waren unerwartete Werte die in die Variable geschrieben wurde, die haben mir den Tag versaut.

    Man beachte, dass eine Variable leer , bzw einen string enthalten enthalten kann, damit ist das wandeln nach int eben mist.

    Hab das jetzt abgefangen und es tut

    Bloody learning
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  4. #4
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    Ich kann nur empfehlen da immer gleich ein halbwegs vernünftiges logging einzubauen, das kann man dann auch im Produktivbetrieb bei Bedarf kurz mal hochdrehen und dann sieht man recht schnell wo's krankt.

    Z. B. in PHP:

    PHP-Code:
    <?PHP

    include "config.php";

    function 
    _log($msg_level,$msg) {

            global 
    $log_level;
            global 
    $log_file;

            if ( 
    $msg_level <= $log_level ) {

                    
    $loghandle fopen("$log_file","a");
                    
    fputs($loghandledate(DATE_RFC822)." ".$msg."\n");
                    
    fclose($loghandle);
            }
    }

    function  
    lg_err ($msg) { global $LOG_ERROR;  _log($LOG_ERROR,   $msg); }
    function  
    lg_info($msg) { global $LOG_INFO;   _log($LOG_INFO,    $msg); }
    function  
    lg_dbg ($msg) { global $LOG_DEBUG;  _log($LOG_DEBUG,   $msg); }
    function  
    lg_dbg2($msg) { global $LOG_DEBUG2_log($LOG_DEBUG2,  $msg); }
    function  
    lg_dbg3($msg) { global $LOG_DEBUG3_log($LOG_DEBUG3,  $msg); }

    ?>

  5. #5
    Registrierter Benutzer Avatar von ThorstenHirsch
    Registriert seit
    Nov 2002
    Beiträge
    6.556
    Hab' mich gewundert, warum Python nicht schon beim int() einen Fehler wirft. Also bei mir wirft er dort schon einen Fehler:
    Code:
    $ ./test.py 
    Traceback (most recent call last):
      File "./test.py", line 3, in <module>
        print int(null)
    NameError: name 'null' is not defined
    ...und...
    Code:
    $ ./test.py 
    Traceback (most recent call last):
      File "./test.py", line 3, in <module>
        print int("")
    ValueError: invalid literal for int() with base 10: ''
    Warum läuft Dein Skript weiter?
    ¡Nuestro amigo... el Computador!

  6. #6
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.243
    Ja das habe ich mich getsern auch gefragt, heute morgen habe ich einiges so umgebaut, dass nur noch int in einem Pfad weiterverarbeitet werden, und alles andere in einem anderen Pfad, Frage mich jetzt aber nicht was ich geaendert habe.

    @fork, danke, das werde ich in Zukunft wohl oefter brauchen.

    Nachdem ich jetzt einiges mit Python verbrechen durfte und vorher mit bash marodiert habe, muss ich sagen,d ass ich Funktionen wie "bash -x" sehr vermisse, gibt es hierfuer ein python aequvalent?
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  7. #7
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    Ich finde nicht, dass das nötig ist, so etwas wie "-x" zu haben. Bash ist da mit den ganzen Interpolationsregeln die sie mittlerweile so hat doch recht komplex. Mir ist so etwas bei Scriptscprachen auch nicht bekannt - aber vielleicht gibt es das ja doch. Ansonsten würden mir da irgendwelche Debugger bzw. Einzelschrittmodus einfallen - habe ich auch noch nicht verwendet. Debugging-Tools gibt's bestimmt so einige.

    Bei Scriptsprachen schaue ich mir persönlich bei Fehlern immer genau die Variablen und vor allem die Datentypen an. Nicht immer passen die Typen zusammen und nicht immer bricht das Programm sofort ab. Manchmal sind die Vergleiche aus eigener Unwissenheit - ich spreche da aus Erfahrung - auch einfach falsch und man muss testen ob mit den verschiedenen Werten auch tatsächlich eine Bedingung so entschieden wird, wie man das erwartet.

    Ansonsten teste ich neue Konstrukte auch immer mal isoliert vorher im interaktiven Interpreter der jeweiligen Scriptsprache. Da sehe ich dann recht schnell ob das so funktioniert, wie ich mir das ausgemalt habe, ob es bricht oder ob ganz andere Ergebnisse als erwartet auftreten.
    Geändert von fork (30.11.16 um 19:20 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.054
    Zitat Zitat von Huhn Hur Tu Beitrag anzeigen
    Nachdem ich jetzt einiges mit Python verbrechen durfte und vorher mit bash marodiert habe, muss ich sagen,d ass ich Funktionen wie "bash -x" sehr vermisse, gibt es hierfuer ein python aequvalent?
    Meinst Du sowas?
    https://docs.python.org/3/library/pdb.html

    ... oder noch ein anderes Google-Ergebnis:
    http://stackoverflow.com/questions/1...set-x-in-shell
    Ich bin root - ich darf das.

  9. #9
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.814
    Ich sag mal so, Python und Testen ist einfach, sogar sehr sehr Einfach. Es macht absolut Sinn, sich da umzustellen, zusätzlich noch pep8 checker drüber rennen lassen und man braucht so ein -x nicht mehr wirklich.

    [edit]PHP Ansatz von vorher in Python3 - https://docs.python.org/3/howto/logging-cookbook.html:
    Code:
    import logging
    
    
    logger = logging.getLogger()
    logger.debug('debug msg')
    logger.info('info msg')
    logger.warning('warning msg')
    logger.error('error msg')
    logger.critical('critical msg')
    Geändert von nopes (30.11.16 um 20:00 Uhr)
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  10. #10
    Banned
    Registriert seit
    Feb 2005
    Beiträge
    1.151
    ipython ist dein Freund

  11. #11
    Registrierter Benutzer Avatar von ThorstenHirsch
    Registriert seit
    Nov 2002
    Beiträge
    6.556
    Logging vs. debugging/tracing... also ich baue in viele meiner Skripte zwar auch einen debug-Modus ein, bei dem mir das Skript Ausgaben liefert, die ich im normalen Betrieb nicht brauche, sondern nur um Fehlern auf die Schliche zu kommen, aber das ist zusätzlicher Code, der nicht dem Zweck des Programms dient und im Normalfall gar nicht ausgeführt wird - bläht den Code also nur unnötig auf.

    Mit "sh -x" oder "perl -d" braucht's keinen unnötigen Code. Aber dann hat man gleich den ganzen Batzen an zusätzlicher Ausgabe und darf seine Fehlerursache wie die Nadel im Heuhaufen suchen. Mittlerweile bin ich bei Perl soweit, dass ich weiterhin einen debug-Modus implementiere, aber keine manuelle Ausgabe ins Skript einstreue, sondern (nur im debug-Modus) mittels Carp::longmess den stack trace ausgeben lasse. Ohne debug-Modus gibt's nur einfache Fehlermeldungen. Das funktioniert natürlich nur, wenn das Skript abbricht statt Fehler stillschweigend hinzunehmen. Aber es heißt ja auch "crash early, crash often".

    tl;dr: Eigentlich sind die Zeiten vorbei, zu denen man (fachlich nicht relevante) Log-Ausgabe in seine Skripte einbauen musste um Fehler zu debuggen.
    ¡Nuestro amigo... el Computador!

  12. #12
    Banned
    Registriert seit
    Feb 2005
    Beiträge
    1.151
    Zitat Zitat von BetterWorld Beitrag anzeigen
    ipython ist dein Freund
    Ich glaube, ich sagte schon mal, dass ipython dein Freund wäre.

  13. #13
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    Zitat Zitat von ThorstenHirsch
    Logging vs. debugging/tracing... also ich baue in viele meiner Skripte zwar auch einen debug-Modus ein, bei dem mir das Skript Ausgaben liefert, die ich im normalen Betrieb nicht brauche, sondern nur um Fehlern auf die Schliche zu kommen, aber das ist zusätzlicher Code, der nicht dem Zweck des Programms dient und im Normalfall gar nicht ausgeführt wird - bläht den Code also nur unnötig auf.
    Ja es bläht den Code ein bisschen auf. Nach etwas Überlegung meine ich, dass das der Weg des Debuggings ist, den ich haben will. Wenn ich ein grösseres Projekt habe, dann will ich beim besten willen nicht eine "set -x" - artige Ausgabe von endlosen Schleifendurchläufen haben. Da möchte ich ein niedriges Debuglevel haben und bei kritischen Stellen zur Fehlersuche dann das gezielt und partiell nach oben drehen.

    Grundsätzlich ist es auch immer die Frage, wie man programmiert und wieviel Zeit man sich dafür nimmt. Von dem, was ich schreibe ist nicht so viel für die Ewigkeit gedacht. Und nicht immer will man das sofort der kleinste Fehler bricht und die Anwendung nicht mehr funktioniert. Manche Fehler sind auch nicht solche, die man aus Faulheit in Kauf nimmt, sondern solche die man gar nicht ahnt. Genau dort ist es dann der Punkt an dem ich dann notgedrungen anfange für die Problemlösung Debuggingcode einzufügen und mich ärgere, dass ich es nicht gleich gemacht habe.

    Was den Bloat angeht: Debugging-Code finde ich wertvoll, und er erhöht auch die Lesbarkeit des Codes. Die Komplexität erhöht sich dadurch nicht besonders.

    Aber es gibt natürlich immer wieder Umgebungen, wo es gar nicht schnell genug sein kann. Bei dem, was ich geschrieben habe ist das bisher nie so gewesen, dass das wirklich so kriegsentscheidend war. Wenn doch, dann gibt es mit Sicherheit Möglichkeiten, Geschwindigkeitseinbußen durch Debugging-Code zu eliminieren:

    • Man könnte die Debugging-Funktionen durch leere Funktionen überschreiben
    • Man könnte per Policy definieren, dass ein Debug-Statement immer in einer eigenen Zeile sein muss und für das ein- und ausschalten von Debug-Code wird dann rekursiv per Suchen+Ersetzen ein spezieller Kommentarmarker gesetzt oder enternt.
    • Man könnte mit einem Makro-Präprozessor wie m4 arbeiten, der den Quellcode vor Ausführung bearbeitet und je nachdem ob die Debugging-Option aktiviert ist, oder nicht, wird der Code eben eingebunden oder nicht

  14. #14
    Banned
    Registriert seit
    Feb 2005
    Beiträge
    1.151
    Am Rande: Es gibt einen bash Debugger.
    Ist zwar etwas gewöhnungsbedürftig und erfordert ein wenig Einarbeitungszeit, bis man das begriffen hat, abba dann!!!

    Für einfacher Sachen, hab ich mir eine lib_bash_debug geschrieben. Die wird einfach gesourced und man hat dann einfach Statements, wie DEBUGvar <name>, was nicht nur Vars, sondern auch Arrays ausgeben kann, DEBUBstart/stop usw. zur Verfügung.
    Mittlerweile nehme ich nur noch bashdb.
    Geändert von BetterWorld (03.12.16 um 01:03 Uhr)

Ähnliche Themen

  1. Python3 sftp
    Von Huhn Hur Tu im Forum Linux als Server
    Antworten: 17
    Letzter Beitrag: 21.11.16, 08:33
  2. python3 postgre gibt none zurueck
    Von Huhn Hur Tu im Forum Linux als Server
    Antworten: 3
    Letzter Beitrag: 19.09.16, 08:44
  3. Wahr oder nicht wahr ? Lachen oder Weinen,100% Off Topic
    Von Archeon im Forum Meldungen und Mitglieder
    Antworten: 4
    Letzter Beitrag: 03.10.03, 13:15
  4. Antworten: 12
    Letzter Beitrag: 17.07.02, 13:24
  5. smb-pw-encryption - oder nicht? oder doch?
    Von Dotvoid im Forum Linux als Server
    Antworten: 4
    Letzter Beitrag: 13.11.01, 21:49

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •