2016-08-02 45 views
0

ich eine Python-Funktion, die eine arbirary Anzahl von Bytes an einen Bus schreiben muss:Liste Argument übergeben auf -int iteriert werden nicht iterable

def Writebytes(self,values): 
    for byte in values: 
     self.writebyte(byte) 

Die Idee wird Ihnen eine Liste von Bytes übergeben und es schreibt sie alle in den Bus, z

data=[0x10,0x33,0x14] 
object.Writebytes(data) 

Ich mag würde ein einziges Byte schreiben, ohne die [] so unterstützen, dass Sie eingeben können:

data=0x00 
object.Writebytes(data) 

das Ziel seine Nutzung zu erleichtern. Sie können jedoch nicht über den Int, der an Writebytes übergeben wird, iterieren. Gibt es eine einfache Möglichkeit, die Eingabe zu zwingen, immer eine Liste zu sein? (vorzugsweise in der Funktionsdefinition ..)

All diese iterables Zeug ist neu für mich in meiner ersten Woche von Python (was eigentlich ziemlich gut gegangen ist, zu Pythons Kredit). Ich benutze Python3 meist auf einem RPi btw ..

Vielen Dank!

Antwort

1

Sie immer eine try except Anweisung

def Writebytes(self,values): 
    try: 
     for byte in values: 
      self.writebyte(byte) 
    except TypeError: 
     self.writebyte(values) 
+0

Danke für den Vorschlag - das scheint ein ordentlicher Weg zu sein. Ich kann sehen, dass es robust ist, wie Sie erwähnt haben. Danke für die tolle Beratung - sehr geschätzt. – BrightSparkey

1

Ich denke, der einfachste Weg, um dies zu realisieren wäre:

def Writebytes(self,values): 
    if(not isinstance(values, list)): 
     values = [values] 
    for byte in values: 
     self.writebyte(byte) 
+0

Die andere Antwort als meine robustere aussieht verwenden kann, so dass ich versuchen würde, dass Zuerst, wenn ich Sie wäre –

+1

Ihre Lösung ist in Ordnung, wenn die Eingabe garantiert ist entweder eine Liste oder ein Skalar. Wenn der Benutzer jedoch einen anderen Typ von Iterable (z. B. ein Tupel) übergibt, wird es fehlschlagen. Meine Lösung überprüft im Grunde nur alle Arten von Iterablen, bevor man annimmt, dass es ein Skalar ist. –

+0

Ja, das habe ich gemerkt, nachdem du deine gesehen hast. –