ubuntuusers.de

Python Script

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

seahawk1986 schrieb:

Eigentlich muss man ja sowieso immer wissen mit welchem Encoding die Daten reinkommen und wie sie wieder rausgehen sollen. Wäre ja zu einfach, wenn man sich mal auf UTF-8 einigen könnte...

Sicherlich wäre das eine Vereinfachung - aber das ist aufgrund der historisch gewachsenen Systeme eben utopisch!

Dennoch wäre es imho eine erhebliche Erleichterung, wenn man print() wenigstens ein optionales Encoding mitgeben könnte und es per default auf *einem* fix definierten Encoding arbeitete (idealer Weise UTF-8) und nicht auf einem System abhängigen (wie z.B. auch Java). Hier hätte man es definitiv besser machen können als viele andere vor einem.

Sicherlich hätte das für viele erst einmal bedeutet, dass sie ein Encoding übergeben müssen (auf Windows eben typischer Weise cp1252), aber man hätte ein verlässliches API gehabt. *seufz* Naja, vielleicht kommt ja noch mal ein optionales encoding für print(). Dann würden meine Module immer folgendes zu Beginn beinhalten:

1
print = partial(print, encoding="utf-8")

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

@Lysander: Eigentlich geht das auch jetzt schon (wenn auch über einen kleinen Umweg):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# coding: utf-8
from __future__ import print_function
from codecs import getwriter
from sys import stdout

def main():
    print('späm')
    ascii_stdout = getwriter('ascii')(stdout)
    print('späm', file=ascii_stdout)  # wird nun fehlschlagen


if __name__ == '__main__':
    main()

Die Übertragung auf dein partial-Beispiel überlasse ich dem (fähigen) Leser... 😉

EDIT: Wobei der von getwriter() zurückgelieferte StreamWriter laut PEP 400 wohl problematisch ist. Daher hier mal eine Variante via io.open():

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# coding: utf-8
from __future__ import print_function, unicode_literals

import io
import sys

def wrap_outstream(stream, encoding):
    return io.open(stream.fileno(), 'w', encoding=encoding, closefd=False)

def main():
    print('späm')
    ascii_stdout = wrap_outstream(sys.stdout, 'ascii')
    print('späm', file=ascii_stdout)  # wird nun fehlschlagen


if __name__ == '__main__':
    main()

Nicht gerade super-benutzerfreundlich, aber so würde dein Vorhaben immerhin funktionieren, sofern ich dich nicht missverstanden habe.

Antworten |