2013-05-21 18 views
14

Come si "dichiara" una variabile vuota bytes in Python 3?Python 3 Come faccio a 'dichiarare' una variabile `byte` vuota

Sto provando a ricevere blocchi di byte e in seguito lo cambio in una stringa utf-8. Tuttavia, non sono sicuro di come dichiarare la variabile iniziale che manterrà l'intera serie di byte. Questa variabile è denominata msg. Non posso dichiararlo come None, perché non è possibile aggiungere uno bytes e uno NoneType. Non posso dichiararlo come una stringa unicode, perché quindi cercherò di aggiungere bytes a una stringa. Inoltre, man mano che il programma di ricezione si evolve, potrebbe mettermi in disordine con serie di byte che contengono solo parti di caratteri. Non posso fare a meno di una dichiarazione msg, perché quindi fare riferimento a msg prima dell'assegnazione. Quello che segue è il codice in questione

def handleClient(conn, addr): 
    print('Connection from:', addr) 
    msg = ? 
    while 1: 
     chunk = conn.recv(1024) 
     if not chunk: 
      break 
     msg = msg + chunk 
    msg = str(msg, 'UTF-8') 
    conn.close() 
    print('Received:', unpack(msg)) 
+3

Questo è l'inizializzazione, non è dichiarazione. Python non ha una dichiarazione di tipi. – geoffspear

+1

diresti "inizializzazione" o "istanziazione"? Forse entrambi ... Ma come dici tu, sicuramente non "dichiarazione" – mgilson

risposta

28

Basta utilizzare una stringa di byte vuota, b''.

Tuttavia, concatenare una stringa implica ripetutamente la copia della stringa molte volte. Un bytearray, che è mutevole, sarà probabilmente più veloce:

msg = bytearray() # New empty byte array 
# Append data to the array 
msg.extend(b"blah") 
msg.extend(b"foo") 

per decodificare l'array di byte in una stringa, utilizzare msg.decode(encoding='utf-8').

+4

Puoi anche solo tenere i blocchi ricevuti in una lista e unirli alla fine. –

+0

Anche se il programma non fosse interamente collegato all'I/O in attesa sul socket, non posso immaginare che il costo delle prestazioni sarebbe davvero importante ovunque. – abarnert

+2

Da un test rapido, con 1024 pezzi di 1024 byte, a 64-bit Python 3.3.1, 'bytes' prese 30.1ns,' bytearray' preso 29.6ns, 'join' preso 29.9ns. – abarnert

-1

Come da documentazione:

Blockquote socket.recv (bufsize [, flags]) ricevere i dati dal socket. Il valore restituito è una stringa che rappresenta i dati ricevuti. Blockquote Quindi, penso msg = "" dovrebbe funzionare bene:

>>> msg = "" 
>>> msg 
'' 
>>> len(msg) 
0 
>>> 
+4

Sembra che tu stia citando [la documentazione 2.x Python] (http://docs.python.org/2/library/socket.html#socket.socket.recv), ma la questione è su Python 3, [dove 'recv' restituisce' bytes'] (http://docs.python.org/3/library/socket.html#socket.socket.recv). – jwodder

+0

Il comportamento tra Python 2 e 3 è davvero diverso. Ho appena portato il mio codice da Python 2 a 3 per eliminare il codice aggiuntivo relativo all'unicode. Ho quindi imbattuto in questa differenza, che è il modo in cui ho finito per fare questa domanda. – tsteemers

+0

Ooops ... scusa non ho visto python 3 in cima :( – PSS

1

Usa msg = bytes('', encoding = 'your encoding here').

Encase vuoi andare con la codifica di default, è sufficiente utilizzare msg = b'', ma questa volontà spazzatura l'intero buffer se non nella stessa codifica

Problemi correlati