domanda inizialePython: va bene restituire sia booleano che stringa?
Ho fatto una funzione che è in attesa di una particolare stringa di apparire su una porta seriale, e restituisce tutti i caratteri leggere fino a quando è stata trovata la stringa, o falso in caso contrario. Questo è abbastanza conveniente, ma mi stavo chiedendo se è considerato una cattiva pratica o no?
Chiarimento:
L'obiettivo primario è quello di aspettare per una particolare stringa diad apparire in un determinato periodo di tempo. Tranne che per errore IO, il risultato possibile è True (la stringa è apparsa) o False L'obiettivo secondario è ottenere l'intero risultato, perché potrebbero esserci informazioni che vorrei analizzare prima della risposta effettiva che si sta cercando. Ho pensato che potrei combinare l'obiettivo primario e secondario in un valore di ritorno.
def MyFunc(s, timeout) :
test = get_some_input(timeout)
if test.endswith(s)
return test
else
return False
Modifica: Un'altra risposta proposta è di sollevare un'eccezione. Non penso che sia una buona idea, perché il timeout è un comportamento previsto. Voglio dire, se c'è un parametro per specificare un timeout, allora un timeout è un possibile risultato, e non un'eccezione.
Modifica 2: Poiché ho bisogno di memorizzare l'input, forse l'utilizzo di una classe è la soluzione giusta. La funzione wait ha un chiaro valore di ritorno, tuttavia è accessibile anche l'intera stringa letta fino al timeout.
class Parser :
def __init__(self, sport_name):
self.currentMsg = ''
self.ser = serial.Serial(sport_name, 115200)
def WaitFor(self, s, timeOut=None):
self.ser.timeout = timeOut
self.currentMsg = ''
while self.currentMsg.endswith(s) != True :
# should add a try catch here
c=self.ser.read()
if c != '' :
self.currentMsg += c
else :
print 'timeout waiting for ' + s
return False
return True
Quella cosa ortogonale è perfettamente giusta. Quindi restituire una tupla sarebbe una buona soluzione, tuttavia non mi sento ancora molto a mio agio in questo, inoltre l'uso di una classe mi consente di incorporare una porta seriale e consente un'ulteriore estensione. – shodanex
quindi, quale dovrebbe essere il valore se ok è False? – SilentGhost
@SilentGhost: il valore è sempre un input letto fino a quel momento (fino a quando non è stata trovata una stringa o si è verificato un timeout). – jfs