2016-05-04 12 views
5

Czytam kod źródłowy testinfra w module Ansible. Znalazłem następujące wiersze kodu:Kiedy chr (ord (c)) nie jest równy c w Pythonie?

# Ansible return an unicode object but this is bytes ... 
    # A simple test case is: 
    # >>> assert File("/bin/true").content == open("/bin/true").read() 
    stdout_bytes = b"".join((chr(ord(c)) for c in out['stdout'])) 
    stderr_bytes = b"".join((chr(ord(c)) for c in out['stderr'])) 

To iteracje nad stdout, dostaje porządkowa całkowitą każdego znaku i konwertuje go na ciąg znaków jeden. Ale o co chodzi?

+0

Wersja w języku Python prawdopodobnie ma tutaj znaczenie. W Python2, ord przyjmuje znaki Unicode jako dane wejściowe, ale chr przechodzi tylko z int do ASCII, więc może być tam wykorzystanie jakiegoś dziwactwa? – JETM

+2

Pomoże wskazać, gdzie w kodzie widziałeś tę linię. Nie możemy wiele zrobić bez kontekstu. Zakładam, że odnosisz się do kodu w module [Ansible] (https://github.com/philpep/testinfra/blob/55e4ed92db8cc9fe118fe3da465010169825b0d6/testinfra/backend/ansible.py#L40) ... komentarz tam mógł być przydatny. –

+1

@JeffMercado Tak, jest w kodzie źródłowym ansibla. Czytałem komentarz, ale dlaczego autor korzysta z tego? Czy jest równe 'out ['stdout']. Encode ('ascii')'? – satoru

Odpowiedz

-1

Gdy c jest łańcuchem 8-bitowym. Z docs for ord():

[] powraca do wartości bajta gdy argument jest łańcuchem 8-bitowy

chr() następnie konwertuje je do odpowiedniego charakteru. Zasadniczo po prostu konwertowanie bajtów do postaci, jak mówi komentarz.

+1

Myślę, że powinno być odwrotnie: konwertowanie unikodu na bajt. – satoru

5

Kiedy c jest znak Unicode specyficzne (nie mogą być zakodowane w kodzie ASCII):

>>> ord(u'\u2020') 
8224 
>>> chr(ord(u'\u2020')) 
ValueError: chr() arg not in range(256) 

Jest to prawdą tylko w Python2, jak w Python3, unichr jest usuwany i akty chr jak unichr. Wydaje się to być niezwykłym zachowaniem dla takiej biblioteki, ponieważ rutynowo powodowałoby nieoczekiwany błąd, który jest specyficzny dla wykonywanego programu dla dowolnej lokalizacji narodowej innej niż angielska.

Powiązane problemy