2013-05-21 13 views
14

Jak "deklarować" pustą zmienną bytes w Pythonie 3?Python 3 Jak "deklarować" pustą zmienną "bytes"

Próbuję odebrać porcje bajtów, a później zmienić je na ciąg utf-8. Jednak nie jestem pewien, jak zadeklarować zmienną początkową, która będzie przechowywać całą serię bajtów. Ta zmienna nazywa się msg. Nie mogę zadeklarować tego jako None, ponieważ nie można dodać numeru bytes i NoneType. Nie mogę zadeklarować go jako ciąg znaków Unicode, ponieważ wtedy będę próbować dodać bytes do łańcucha znaków. Ponadto, gdy program odbiorczy ewoluuje, może wpaść na bałagan z serią bajtów, które zawierają tylko części znaków. Nie mogę obejść się bez deklaracji msg, ponieważ wtedy przed odwołaniem byłby przywoływany msg. Poniżej znajduje się kod w pytaniu

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

To inicjalizacji, a nie deklaracja. Python nie ma deklaracji typów. – geoffspear

+1

Czy powiedziałbyś "inicjowanie" lub "tworzenie instancji"? Być może obie ... Ale jak mówisz, zdecydowanie nie "deklaracja" – mgilson

Odpowiedz

28

wystarczy użyć pusty ciąg bajtów b''.

Jednak wielokrotne łączenie z ciągiem powoduje wielokrotne kopiowanie ciągu znaków. bytearray, który jest zmienny, prawdopodobnie będzie szybciej:

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

zdekodować tablicę bajtów na ciąg znaków, użyj msg.decode(encoding='utf-8').

+4

Możesz również zachować otrzymane kawałki na liście i dołączyć do nich na końcu. –

+0

Nawet jeśli program nie był w całości związany z wejściem I/O czekającym na gniazdo, nie wyobrażam sobie, że koszt wykonania będzie miał znaczenie w dowolnym miejscu. – abarnert

+2

Z szybkiego testu, z 1024 porcjami po 1024 bajty, w 64-bitowym Pythonie 3.3.1, "bajtów" zajęło 30.1ns, 'bytearray' zajęło 29,6ns,' join' zajęło 29.9ns. – abarnert

-1

Zgodnie dokumenty:

Blockquote socket.recv (bufsize [, flagi]) odbioru danych z gniazda. Wartością zwracaną jest ciąg reprezentujący odebrane dane. Blockquote Więc myślę msg = "" powinien działać dobrze:

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

Wygląda na to, że cytujesz [dokumentację Pythona 2.x] (http://docs.python.org/2/library/socket.html#socket.socket.recv), ale pytanie dotyczy Pythona 3, [gdzie 'recv' zwraca' bytes'] (http://docs.python.org/3/library/socket.html#socket.socket.recv). – jwodder

+0

Zachowanie między Python 2 i 3 jest rzeczywiście inne. Właśnie przeportowałem swój kod z Python 2 na 3, aby pozbyć się dodatkowego kodu związanego z Unikodem. Potem wpadłem na tę różnicę, w ten sposób zadałem to pytanie. – tsteemers

+0

Ooops ... Niestety nie widziałem pytona 3 na górze :( – PSS

1

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

Encase chcesz iść z domyślnego kodowania, wystarczy użyć msg = b'', ale będzie to śmieci cały bufor, jeśli jej nie w tym samym kodowaniu