为什么python help class将str类的子类解释为模块名称?

时间:2019-12-23 16:20:27

标签: python pydoc

使用字符串类型的参数调用python帮助功能时,pydoc.Helper.help会将其解释为对有关由字符串值标识的主题,符号,关键字或模块的信息的请求。对于其他参数,除非对象是str子类的实例,否则将提供有关对象本身的帮助。在后一种情况下,pydoc.resolve函数将查找名称与对象值匹配的模块,如果找不到则引发异常。

为说明这一点,请考虑示例代码:

class Extra(object): 
       def NewMethod(): return 'New' 
Cls1 = type( 'FirstClass', (str,Extra), {'__doc__':'My new class','extra':'An extra attribute'})
inst1 = Cls1('METHODS')
help( 'METHODS' )
help( inst1 )

第一次调用help会产生关于主题“ METHODS”的信息,而第二次调用会产生错误消息,因为pydoc.resolve函数正试图找到一个名为“ METHODS”的模块。

这意味着很难为用户定义的str子类提供有效的文档。 pydoc.resolve是否不能像pydoc.Helper.help那样对对象的类型进行测试,并且不能将用户定义的子类的实例视为其他类实例?< / p>

该问题来自先前对相关问题here的讨论。

1 个答案:

答案 0 :(得分:0)

简单的答案是,创建str的用户定义子类不是最常见的情况—部分原因是用户定义的数据而不是字符串数据是可变的。在您不得不处理此类问题时,可以想象您知道如何编写help(type(x)),并且通常使用正确的默认设置是使用isinstance而不是type(…) is …。 (另一种方法是,如果您想像其他字符串一样使用help(str(x))选择一个帮助主题,那肯定更罕见。)

相关问题