Kann mir jemand sage was folgender Pythoncode macht?

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.
roth86
User
Beiträge: 10
Registriert: Dienstag 12. Dezember 2006, 11:19

Dienstag 12. Dezember 2006, 11:21

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dienstag 12. Dezember 2006, 11:30

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 ...
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 12. Dezember 2006, 12:03


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

Dienstag 12. Dezember 2006, 13:23

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.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Dienstag 12. Dezember 2006, 14:09

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.
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

Dienstag 12. Dezember 2006, 14:20

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 ...
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dienstag 12. Dezember 2006, 14:35

sunmountain hat geschrieben:55 ways to leave your lover ...
Da muss ich dich enttaeuschen, es sind nur 50. :D
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Dienstag 12. Dezember 2006, 15:20

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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Dienstag 12. Dezember 2006, 16:40

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
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Dienstag 12. Dezember 2006, 17:06

weil ich den hammer so liebgewonnen habe, und das so sehr nach nagel aussah ;)

ne, ernsthaft: deins ist zu bevorzugen.
roth86
User
Beiträge: 10
Registriert: Dienstag 12. Dezember 2006, 11:19

Mittwoch 13. Dezember 2006, 09:29

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
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Mittwoch 13. Dezember 2006, 11:31

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?
Dispersio
User
Beiträge: 11
Registriert: Freitag 24. November 2006, 14:24

Mittwoch 13. Dezember 2006, 11:39

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.
BlackJack

Mittwoch 13. Dezember 2006, 13:04

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mittwoch 13. Dezember 2006, 13:32

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
Antworten