import

Code-Stücke können hier veröffentlicht werden.
Antworten
Reini

Hallo Forum,
folgendes Problem:

ich habe eine Funktion welche überprüft ob ein String nur Hexadezimalzahlen enthält (ohne 0x Suffix) zusätzlich muss man der Funktion noch die erwartete Anzahl der Bytes übergeben damit Sie überprüfen kann ob auch die empfangene Byteanzahl stimmt.

def lookinchar(y):
try: return (int(y,16) in range(0,256))
except ValueError: return None

def check(wert,anz_bytes):
list=[]
counter=0
z=""
for y in wert:
if(y!=" "): #leerzeichen werden ausgefiltert
z+=y
counter+=1
if(counter==2):
list.append(z)
z=""
counter=0
anz_bytes-=1
if(anz_bytes!=0 or z!=""):
counter=0
else:
counter=1
for y in list:
if(lookinchar(y)):
pass
else:
counter=0
print counter
print check("Eg",1)

das funktioniert soweit, auf Grund der Übersichtlichkeit möchte ich aber die Funktion lookinchar in ein anderes File schreiben, dann mache ich zusätzlich ein
#import functions
und die Zeile: if(lookinchar(y)): wird ersetzt durch
functions.lookinchar(y)):
jetzt bekomme ich aber folgendes von Python zurück:
Traceback (most recent call last):
File "C:\Python24\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
exec codeObject in __main__.__dict__
File "C:\Python24\Scripts\Script1.py", line 27, in ?
print check("Eg",1)
File "C:\Python24\Scripts\Script1.py", line 22, in check
if(script2.lookinchar(y)):
File "C:\Python24\Scripts\script2.py", line 5, in lookinchar
except ValueError: return None
ValueError: invalid literal for int(): Eg
warum? den Error sollte ich doch mit dem try abgefangen haben und warum funktioniert es wenn man es in einer Datei schreibt aber nicht wenn man die Funktion aus einer anderen Datei aufruft??
BlackJack

Ich habe keine Ahnung warum es nicht funktioniert.

Ich hätte aber Anmerkungen zu Deinem Code. Er ist etwas unübesichtlich. Du benutzt `counter` anscheinend für zwei verschiedene Zwecke, einmal als Zähler und dann als eine Art "Flag". Deine `check()`-Funktion hat gar keinen Rückgabewert, liefert also grundsätzlich `None`. Und `lookinchar()` liefert `True` falls es ein Hexadezimal-String ist, der ein Byte beschreibt und `None` falls nicht. Das ist etwas "unsymmetrisch". Normalerweise würde man dort `False` erwarten.

Zu guter letzt noch eine einfachere Variante der `check()` Funktion:

Code: Alles auswählen

import string

def check2(value, bytecount):
    value = value.replace(' ', '')
    
    for character in value:
        if not character in string.hexdigits:
            return False
    
    return (len(value) // 2) == bytecount
Erst werden die Leerzeichen entfernt, dann wird geprüft ob jedes Zeichen auch eine gültige "Hex-Ziffer" ist und dann noch ob die Länge (ohne die Leerzeichen) mit der angegebenen Byte-Anzahl übereinstimmt (2 Hex-Ziffern = 1 Byte).
Antworten