2015-08-14 2 views
2

Я знаю, что getpass возвращает строку Юникода в Python 3 и некоторый str в Python 2. Тем не менее, я не уверен насчет кодирования на Python 2.Использование GetPass с Python 2 и 3 совместимости

Как могу ли я преобразовать значение, которое он возвращает в кодированный UTF-8 объект bytes таким образом, который работает как в Python 2, так и в 3?

(я не использую six и я пытаюсь написать код, который просто работает на обоих, а не if Fing на номер версии.)

+2

'p.decode (sys.stdin.encoding) .encode ("UTF-8")' – wenzul

+1

Пробовали ли вы 'от __future__ импорта unicode_literals'? – zopieux

+0

@wenzul, Python 3 строки не имеют метода 'decode', но я могу получить что-то, что работает от этого. – otus

ответ

2

Я бы следовать EAFP политика в этом случае. Попробуйте декодировать() и закодировать() строку, предполагающую ее среду python 2, и ожидать TypeError, а если вы получите TypeError, просто сделайте encode(). Пример -

import sys 
import getpass 

s = getpass.getpass() 

try: 
    u = s.decode(sys.stdin.encoding).encode('UTF-8') 
except TypeError: 
    u = s.encode('UTF-8') 
+0

Спасибо, это работает, по крайней мере. Однако ненужная «попытка» не очень приятная, поэтому я оставлю это непринятое какое-то время, чтобы увидеть, появляются ли другие решения. – otus

+0

Спасибо, исправлено :-). –

2

В Python 2, getpass() возвращает нормальный Python 2 строки, т.е. байтовая строка. Он использует кодировку терминала, поэтому, если терминал настроен на использование UTF-8, вам не нужно ничего делать - возвращаемая строка уже будет кодированной байтовой строкой UTF-8. Но, чтобы быть надежным, вы можете сделать это:

import sys 
from getpass import getpass 

p = getpass() 
if isinstance(p, bytes): 
    p = p.decode(sys.stdin.encoding) 
p = p.encode('utf-8') # :D 

Мы используем if isinstance(p, bytes): остановить Python 3 от прикосновения строки, возвращаемой getpass(), а затем закодировать Unicode в UTF-8

+1

@otus: Моя новая версия должна корректно работать на Python 3. Но если это не поможет, сообщите мне. –

Смежные вопросы