为什么这个Python代码什么都不打印?

时间:2010-01-12 11:16:06

标签: python

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 个答案:

答案 0 :(得分:8)

首先尝试使用某个值初始化字符串:

# 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',) {}
#

答案 1 :(得分:4)

因为你初始化b(作为a的一个对象)没有任何东西作为str。

答案 2 :(得分:4)

尝试打印(self,x,y)。你会看到

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

因此,在str.decode(self,*x,**y)中,self充当空字符串。

答案 3 :(得分:2)

当您发起b1 = a()时,它与b2 = str()几乎相同,只是b2没有bound method b()a }。因此,当您调用b1.b(...)时,它与调用print str.decode(b1,...)print str.decode(b2, ...)

相同

b1b2在它们都是空字符串的方式上是相同的。现在来看看有关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])将对应print str.decode(b1, [encoding], [error type])。 Python会将其翻译为b1。由于'abc'为空且您的“错误类型”b = a('hello')与任何已注册的错误类型都不匹配,因此python只打印出一个空字符串并忽略给定的“错误类型”。

如果您尝试b.b('utf-8', 'abc')hello,您会看到输出为'abc'且与b.b('utf-8', 'abc', 'xyz')无关。此外,如果您尝试再提供一个参数,例如str.decode(),则python将引发错误,因为bound method仅在{{1}}的上下文中接受最多两个参数。