Seite 1 von 1

Kann mir jemand sage was folgender Pythoncode macht?

Verfasst: Dienstag 12. Dezember 2006, 11:21
von roth86
Kann mir jemand sage was folgender Pythoncode macht?

Code: Alles auswählen

def searchHeader( headerList, headerName ):
    index = 0	
    for hdr in headerList:	
        nextHdrName = string.strip( string.split( hdr, ':', 1 )[0] )	
        if nextHdrName == headerName:	
            return SUCCESS, index	
        index += 1	
    return FAILURE,
Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Dienstag 12. Dezember 2006, 11:30
von CM
Hallo und willkommen im Forum,

nun, der Code durchsucht eine Liste (wahrscheinlich eine Liste von Strings) nach einem String und gibt entsprechende return-codes.

Aber mehr Hilfestellung wirst Du wahrscheinlich erst erhalten, wenn Du sagst woher der Code stammt und was Dein Problem ist. Außerdem schaded es nicht den Code in Codetags zu kleiden (Der "Python"-Knopf in der oberen Zeile, wenn Du Deinen Post schreibst ;-) .)
Manchmal kann jemand hier raten, weil er / sie den Code schon mal gesehen hat, aber im allgemeinen fehlen hier im Forum die übersinnlichen Fähigkeiten. ;-)

Gruß,
Christian

PS So richtig dolle sieht der Code außerdem nicht aus ...

Verfasst: Dienstag 12. Dezember 2006, 12:03
von jens

Re: Kann mir jemand sage was folgender Pythoncode macht?

Verfasst: Dienstag 12. Dezember 2006, 13:23
von sunmountain
roth86 hat geschrieben:Kann mir jemand sage was folgender Pythoncode macht?

Code: Alles auswählen

def searchHeader( headerList, headerName ):
    index = 0	
    for hdr in headerList:	
        nextHdrName = string.strip( string.split( hdr, ':', 1 )[0] )	
        if nextHdrName == headerName:	
            return SUCCESS, index	
        index += 1	
    return FAILURE,
Wobei das auch so ginge:

Code: Alles auswählen

def searchHeader( headerList, headerName ):
    hdr =  [ hdr.split(':',1)[0] for hdr in headerList]
    try: index = hdr.index(headerName)
    except: index = None
    if index: return SUCCESS,index
    else: return FAILURE,
Erzeuge aus headerList eine Liste mit dem am weitesten links und durch
':' getrennt stehenden Werten.

Beispiel:

Code: Alles auswählen

headerList = ['1:2:3','4:5:6']
hdr =  [ hdr.split(':',1)[0] for hdr in headerList]
print hdr
liefert:

Code: Alles auswählen

['1', '4']
Das ,1 sorgt dafür das der String nur einmal getrennt wird.


Versuche nun die Position von headerName in dieser Liste zu finden.

Beipiel:

Code: Alles auswählen

headerName='4'
index = hdr.index(headerName)
print index
liefert:
= 2. Position (Listen,Tuple,Strings etc. fangen bei 0, wie in C/C++

Falls der index einen Wert hat (None entspricht hier False),
liefere den Wert für SUCCESS und den index zurück,
ansonsten nur FAILURE.
Das

Code: Alles auswählen

FAILURE,
sorgt dafür, das in beiden Fällen eine Liste zurückgegeben wird,
im letzteren Fall aber nur mit einem Element.

Re: Kann mir jemand sage was folgender Pythoncode macht?

Verfasst: Dienstag 12. Dezember 2006, 14:09
von keppla
Und noch eine Alternative:

Code: Alles auswählen

def searchHeader( headerList, headerName ):
  dct = dict(
    [ hdr[:hdr.index(':')], i) for i, hdr in enumerate(headerList) ]
  )
  if headerName in dct:
    return (SUCCESS, dct[headerName])
  else:
    return (FAILURE, )
Wobei ich persönlich das zurückgeben von erfolgswerten für nicht sonderlich "pythonic" halte, für sowas wurden exceptions erfunden.

Re: Kann mir jemand sage was folgender Pythoncode macht?

Verfasst: Dienstag 12. Dezember 2006, 14:20
von sunmountain
keppla hat geschrieben:Und noch eine Alternative:

Code: Alles auswählen

def searchHeader( headerList, headerName ):
  dct = dict(
    [ hdr[:hdr.index(':')], i) for i, hdr in enumerate(headerList) ]
  )
  if headerName in dct:
    return (SUCCESS, dct[headerName])
  else:
    return (FAILURE, )
Wobei ich persönlich das zurückgeben von erfolgswerten für nicht sonderlich "pythonic" halte, für sowas wurden exceptions erfunden.
Durch das Idiom muss man erst mal durchsteigen ;-)
55 ways to leave your lover ...

Re: Kann mir jemand sage was folgender Pythoncode macht?

Verfasst: Dienstag 12. Dezember 2006, 14:35
von Rebecca
sunmountain hat geschrieben:55 ways to leave your lover ...
Da muss ich dich enttaeuschen, es sind nur 50. :D

Re: Kann mir jemand sage was folgender Pythoncode macht?

Verfasst: Dienstag 12. Dezember 2006, 15:20
von keppla
sunmountain hat geschrieben:Und noch eine Alternative:

Code: Alles auswählen

def searchHeader( headerList, headerName ):
  dct = dict(
    [ hdr[:hdr.index(':')], i) for i, hdr in enumerate(headerList) ]
  )
  if headerName in dct:
    return (SUCCESS, dct[headerName])
  else:
    return (FAILURE, )
Wobei ich persönlich das zurückgeben von erfolgswerten für nicht sonderlich "pythonic" halte, für sowas wurden exceptions erfunden.
keppla hat geschrieben:Durch das Idiom muss man erst mal durchsteigen ;-)
55 ways to leave your lover ...
Ich find es eigentlich einfacher lesbar als deines (kein vorwurf), ich glaube, dass ist Geschmackssache.

Code: Alles auswählen

[ (hdr[:hdr.index(':')], i) for i, hdr in enumerate(headerList) ]
gibt eine Liste aus tupeln zurück, die als erstes Element den Headernamen, als zweites den Index enthalten. Das mache ich dann per dict() zu einem dict, aus dem man per lookup den index ermittelt.

Verfasst: Dienstag 12. Dezember 2006, 16:40
von rayo
Hi

Uff warum so kompliziert mit dicts usw?

Code: Alles auswählen

def searchHeader( headerList, headerName ):
    for i,x in enumerate(headerList):
        if x.startswith(headerName+":"):
            return SUCCESS, i
    return FAILURE,
Gruss

Verfasst: Dienstag 12. Dezember 2006, 17:06
von keppla
weil ich den hammer so liebgewonnen habe, und das so sehr nach nagel aussah ;)

ne, ernsthaft: deins ist zu bevorzugen.

Verfasst: Mittwoch 13. Dezember 2006, 09:29
von roth86
Hier noch ein Pythoncode. Der ein bischen komplexer ist. Er funktioniert einwandfrei. Jedoch sollte ich auch die funktionen verstehen?

Code: Alles auswählen

def CompareDefaultContents( api, incomingMessage, sentContentList ):
    
    index = 0
    missing = 0 
    mismatch = 0
    missingErrMsg = 'Missing Content Types'
    mismatchErrMsg = ' Dissimilar Content Types'
    compareDetail = ''

    compCrit = api.SetCompareCriteria( COMPARE_NAME, COMPARE_TYPE,\
                               COMPARE_LENGTH, TOLERANCE_PERCENTAGE )
	 
    for contentInfo in defaultContents:	 
        contentType = contentInfo[0]	
        contentName = contentInfo[2]

        try:
            rcvdCont, detail = incomingMessage.SrchContentName
            ( contentName ) except:
            missing = 1
            missingErrMsg += '\n' + str( contentType ) 
            + ' named ' + str( contentName )
            Continue	
	
        try:	
            cmpResult, detail = rcvdCont.Compare
            ( sentContentList[index],\
                                                  compCrit )
            compareDetail += str( detail ) + '; '
        except:
            mismatch = 1
            mismatchErrMsg += '\n' + str( contentType ) 
            + ' named ' + str( contentName ) + '( '\
                              + str( sys.exc_info()[1] ) + ' )'
        index += 1    

    if missing or mismatch:
        errMsg = ''
        if missing:
            errMsg += missingErrMsg + '; '
        if mismatch:
            errMsg += mismatchErrMsg + '; '

        return FAILURE, errMsg
            
    return SUCCESS, compareDetail

Verfasst: Mittwoch 13. Dezember 2006, 11:31
von keppla
roth86 hat geschrieben:Hier noch ein Pythoncode. Der ein bischen komplexer ist. Er funktioniert einwandfrei.
Wetten, dass nicht? zwei "try" hinternander, ohne except oder else. unbekanntes keyword Continue. falscher Zeilenumbruch im zweiten try.
Ich hab ihn zwar nicht getestet, aber ich bin mir da doch recht sicher.
Jedoch sollte ich auch die funktionen verstehen?
Was genau verstehst du denn nicht?

Verfasst: Mittwoch 13. Dezember 2006, 11:39
von Dispersio
Hi
keppla hat geschrieben:zwei "try" hinternander, ohne except oder else.
Es gibt eh 2 except. Eines in zeile 20 (komisch plaziert), das andere ist in zeile 31(deutlich sichtbar :P )

Was ich aber auch komisch finde ist das z.B.: nirgendwo contentInfo definiert ist.

Verfasst: Mittwoch 13. Dezember 2006, 13:04
von BlackJack
Dispersio hat geschrieben:Was ich aber auch komisch finde ist das z.B.: nirgendwo contentInfo definiert ist.
Wenn man mal von der allgemeinen Qualität des Quelltextes ausgeht, ist das sicher global definiert.

Verfasst: Mittwoch 13. Dezember 2006, 13:32
von CM
BlackJack hat geschrieben:Wenn man mal von der allgemeinen Qualität des Quelltextes ausgeht, ist das sicher global definiert.
:D

Darf ich konstatieren, daß eingetreten ist, was ich befürchtet habe: Die ursprüngliche Anfrage wurde erweitert, statt klar definiert zu werden und wir überschlagen uns in Verbesserungsvorschlägen - u. U. auch so etwas wie premature optimization, bzw. voreilige Hilfestellung, weil eigentlich nicht klar ist, worauf roth86 überhaupt hinauswill, welches Modul benutzt wird und was die Funktion dieser Funktionen sein soll (auch wenn das auf abstrakter Ebene sicher zu erklären ist), oder?

Gruß,
Christian

edit: Zeichensetzung

Verfasst: Mittwoch 13. Dezember 2006, 17:13
von Leonidas
CM hat geschrieben:Darf ich konstatieren, daß eingetreten ist, was ich befürchtet habe: Die ursprüngliche Anfrage wurde erweitert
Jup. Wie wärs wenn ich noch einen zufälligen Ausschnitt aus dem PyPy Quellen nehme und auch nochtmal frage was das sein soll? ;)

roth86: Sag uns doch bitte, was du überhaupt bezwecken willst.