Seite 1 von 1

Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 09:40
von burli
Hi, wenn ich das richtig sehe ist das Ergebnis von glob.glob() eine Liste. Ich suche mit glob.glob('/dev/ttyS*') nach vorhandenen seriellen Schnittstellen und erhalte auch eine Liste

['/dev/ttyS3', '/dev/ttyS2', '/dev/ttyS1', '/dev/ttyS0']

Allerdings schaffe ich es nicht, diese Liste zu sortieren. Hier ein kurzes Testprogramm

Code: Alles auswählen

import sys
import serial
import glob

def scan():
    """scan for available ports. return a list of device names."""
    return glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*')

comports = scan()
print comports
comports = comports.sort()
print comports
Das Ergebnis:

Code: Alles auswählen

['/dev/ttyS3', '/dev/ttyS2', '/dev/ttyS1', '/dev/ttyS0']
None
Ich habe alle Varianten durch, aber ich stehe auf dem Schlauch.

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 09:41
von sma
sort() sortiert die Liste, auf die es angewendet wird und liefert NICHT eine neue sortierte Liste zurück.

Stefan

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 09:51
von burli
hm, aber müsste dann scan().sort() nicht auch funktionieren?

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 09:56
von snafu

Code: Alles auswählen

def scan():
    return sorted(glob('/dev/ttyS*') + glob('/dev/ttyUSB*'))
`sorted()` liefert eine sortierte Liste zurück, während `list.sort()`, die Liste, wie schon erwähnt wurde in-place sortiert und nichts zurückliefert.

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 09:58
von snafu
burli hat geschrieben:hm, aber müsste dann scan().sort() nicht auch funktionieren?
Das funktioniert sicherlich. In deinem Beispiel bindest du jedoch des Ergebnis der Sortierung (`None`) an `comports` und überschreibst damit die alte Liste. Folglich siehst du quasi kein Ergebnis.

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 10:03
von burli
Die eigentliche Zeile lautet

Code: Alles auswählen

self.comComport.addItems(scan())
und ich wollte eigentlich daraus

Code: Alles auswählen

self.comComport.addItems(scan().sort())
machen. Also den Rückgabewert von scan() sortieren bevor er an addItems() übergeben wird.

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 10:07
von Dav1d
Wie schon erwähnt, du musst sorted nehmen.

Code: Alles auswählen

self.comComport.addItems(sorted(scan()))

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 10:26
von burli
Ok, also sort() kann nur direkt auf eine Liste angewendet werden. scan() selbst ist keine Liste, daher funktioniert es nicht. Soweit richtig verstanden?

Schonmal danke für die Antworten

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 10:58
von EyDu
burli hat geschrieben:Ok, also sort() kann nur direkt auf eine Liste angewendet werden. scan() selbst ist keine Liste, daher funktioniert es nicht. Soweit richtig verstanden?
Nein, du darfst nur nicht den Rückgabewert von sort verwenden. Der ist immer None.

Code: Alles auswählen

spam = scan()
spam.sort()
self.comComport.addItems(spam)

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 11:10
von jbs
Nein.

Code: Alles auswählen

foo = [1,3,6,2,3,1,0]
print 'sortiere foo', foo.sort()
print foo
Inplace bedeutet, dass die Liste verändert wird und der Rückgabewert dieser Funktion ist None.

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 11:12
von burli
Ok, danke, ich denk ich hab es verstanden. Jetzt muss ich es mir nur noch merken :)

Re: Kann Ergebnis von glob.glob() nicht sortieren

Verfasst: Samstag 7. August 2010, 12:07
von snafu
burli hat geschrieben:Ok, also sort() kann nur direkt auf eine Liste angewendet werden. scan() selbst ist keine Liste, daher funktioniert es nicht. Soweit richtig verstanden?
`scan()` ist sehr wohl ein Aufruf, der hier eine Liste zurückliefert. Lediglich `scan` als Name bildet die Funktion ab. Und bekanntlich spielt für die Weiterverarbeitung nur das, was am Ende irgendwo herausgekommen ist, eine Rolle, nicht der Weg, wie etwas zustande gekommen ist.