2016-09-29 11 views
6

W Pythonie 3, jeśli mam ciąg taki, że:Jak zidentyfikować ciąg znaków jako literał literowy?

print(some_str) 

daje coś takiego:

b'This is the content of my string.\r\n' 

wiem, że to bajt dosłowne.

Czy istnieje funkcja, która może zostać użyta do określenia, czy ten ciąg jest w formacie z literą bajtową (w przeciwieństwie do posiadania, na przykład, przedrostka Unicode 'u') bez pierwszej interpretacji? Czy istnieje kolejna najlepsza praktyka do radzenia sobie z tym? Mam sytuację, w której pobieranie ciągów literowych w bajtach musi być traktowane inaczej niż w przypadku kodu Unicode. Teoretycznie coś takiego:

if is_byte_literal(some_str): 
    // handle byte literal case 
else: 
    // handle unicode case 
+5

You * nie * mają 'some_str' masz' some_bytes'! – jonrsharpe

Odpowiedz

13

Najprostszym i, prawdopodobnie, najlepszym sposobem na to będzie poprzez wykorzystanie wbudowanego isinstance z typem bytes:

some_str = b'hello world' 
if isinstance(some_str, bytes): 
    print('bytes') 
elif isinstance(some_str, str): 
    print('str') 
else: 
    # handle 

Ponieważ bajt literał będzie zawsze zawsze instancją bytes, isinstance(some_str, bytes), oczywiście, oceni na True.

4

Tylko dla uzupełnienia innej odpowiedzi, wbudowany type również daje ci tę informację. Możesz go użyć z is i odpowiednim typem, aby to sprawdzić.

Na przykład w Pythonie 3:

a = 'foo' 
print(type(a) is str) # prints `True` 
a = b'foo' 
print(type(a) is bytes) # prints `True` as well 
+4

Powodem użycia 'isinstance()' zamiast porównywania bezpośrednio z 'type', jest to, że [' isinstance() '] (https://docs.python.org/3/library/functions.html#isinstance) będzie uchwyt podklas: obiekt podklasowy 'bytes' nadal będzie ważny jako instancja' bytes', ale nie będzie porównywał poprawny z typem 'bytes'. Zasadniczo preferowane jest zatem 'isinstance()'. – Evert