2016-05-04 12 views
5

Ich lese den Quellcode testinfra im Ansible Modul. Ich fand die folgenden Codezeilen:Wann ist chr (ord (c)) ungleich c in Python?

# 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'])) 

es über stdout iteriert, erhält die ganzzahligen Ordinalzahl jeden Zeichen und wandelt sie zurück in einem Ein-Zeichen-String. Aber was ist der Sinn?

+0

Python-Version spielt wahrscheinlich hier eine Rolle. In Python2 nimmt ord Unicode-Zeichen als Eingabe, aber chr geht nur von int nach ASCII, so dass dort vielleicht etwas Seltsames ausgenutzt werden könnte? – JETM

+2

Es wäre hilfreich, darauf hinzuweisen, wo im Code diese Zeile angezeigt wurde. Ohne Kontext können wir nicht viel tun. Ich nehme an, Sie beziehen sich auf den Code im Modul [Ansible] (https://github.com/philpep/testinfra/blob/55e4ed92db8cc9fe118fe3da465010169825b0d6/testinfra/backend/ansible.py#L40) ... der Kommentar dort hätte nützlich sein können. –

+1

@JeffMercado Ja, es ist im ansible Backend-Quellcode. Ich habe den Kommentar gelesen, aber warum benutzt der Autor das? Ist es gleich out ['stdout']. Encode ('ascii') '? – satoru

Antwort

-1

Wenn c eine 8-Bit-Zeichenfolge ist. Vom docs for ord():

[kehrt], um den Wert des Bytes, wenn das Argument ist ein 8-Bit-String

chr() dann zu dem entsprechenden Zeichen wandeln diese. Es ist im Grunde nur Bytes in ein Zeichen zu konvertieren, wie der Kommentar sagt.

+1

Ich denke, es sollte umgekehrt sein: Unicode in Byte umwandeln. – satoru

5

Wenn c ist Unicode-spezifische Charakter (nicht in ASCII codiert werden):

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

Dies gilt allerdings nur in Python2, wie in Python3, unichr entfernt und chr wirkt als unichr. Dies scheint ein ungewöhnliches Verhalten für eine solche Bibliothek zu sein, da es routinemäßig einen unerwarteten Fehler auslöst, der für jedes nicht-englische Gebietsschema ausführbar ist.