Почему этот код Python ничего не печатает? - PullRequest
0 голосов
/ 12 января 2010
class a(str):
    def b(self,*x,**y):
        print str.decode(self,*x,**y)

b=a()
b.b('utf-8','aaa') # This prints nothing, why?

Ответы [ 4 ]

8 голосов
/ 12 января 2010

Попробуйте сначала инициализировать вашу строку с некоторым значением:

# classes should have capitalized names ...
class a(str):
    def b(self,*x,**y):
        print 'debugging: ', self, x, y
        print str.decode(self, *x,**y)

if __name__ == '__main__':
    b=a('aaa')
    b.b('utf-8')

    b=a()
    b.b('utf-8')

# => output

# debugging:  aaa ('utf-8',) {}
# aaa
# debugging:   ('utf-8',) {}
#
4 голосов
/ 12 января 2010

Попробуйте распечатать (self, x, y). Вы увидите

('', ('utf-8', 'aaa'), {})

Следовательно, в str.decode(self,*x,**y), self действует как пустая строка.

4 голосов
/ 12 января 2010

потому что вы инициализируете b (как объект a) ни с чем как стр.

2 голосов
/ 12 января 2010

Когда вы начинаете b1 = a(), это почти то же самое, что и b2 = str(), за исключением того, что b2 не имеет bound method b() класса a. Следовательно, когда вы вызываете b1.b(...), это то же самое, что вызывать print str.decode(b1,...) или print str.decode(b2, ...)

b1 и b2 одинаковы в том смысле, что оба являются пустыми строками. Теперь посмотрим, что в документах говорится о str.decode.

декодирование (...) S.decode ([кодировка [, ошибки ]]) -> объект

Decodes S using the codec registered for encoding. encoding defaults
to the default encoding. **errors** may be given to set a different error
handling scheme. Default is 'strict' meaning that encoding errors raise
a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
as well as any other name registerd with codecs.register_error that is
able to handle UnicodeDecodeErrors.

Это означает, что третий параметр (фактически второй в контексте bound method) является своего рода типом ошибки, который будет игнорироваться, если он не соответствует ни одному встроенному (зарегистрированному) типу.

Поэтому, когда вы звоните b1.b('utf-8', 'abc'), это будет соответствовать b1.b([encoding], [error type]). Python переведет его на print str.decode(b1, [encoding], [error type]). Поскольку b1 пусто, а ваш "тип ошибки", который является 'abc', не соответствует ни одному зарегистрированному типу ошибки, python просто выводит пустую строку и игнорирует заданный "тип ошибки".

Если вы попробуете b = a('hello') и b.b('utf-8', 'abc'), вы увидите, что вывод равен hello, и 'abc' не имеет ничего общего. Более того, если вы попытаетесь указать еще один параметр, например b.b('utf-8', 'abc', 'xyz'), python выдаст ошибку, поскольку str.decode() принимает только два аргумента в контексте bound method.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...