为什么python帮助类将str类的子类解释为模块名?
当使用字符串类型的参数调用python help函数时,为什么python帮助类将str类的子类解释为模块名?,python,pydoc,Python,Pydoc,当使用字符串类型的参数调用python help函数时,pydoc.Helper.help将其解释为请求有关由字符串值标识的主题、符号、关键字或模块的信息。对于其他参数,将提供有关对象本身的帮助,除非该对象是str子类的实例。在后一种情况下,pydoc.resolve函数查找名称与对象值匹配的模块,如果没有找到,则引发异常 为了说明这一点,考虑示例代码: class Extra(object): def NewMethod(): return 'New' Cls1 = type
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
生成有关主题“方法”的信息,第二次调用生成错误消息,因为pydoc.resolve
函数正在尝试查找名为“方法”的模块
这意味着很难为str
的用户定义子类提供有效的文档。pydoc.resolve
是否可以像在pydoc.Helper.help
中那样对对象类型进行测试,并允许将用户定义的子类的实例视为其他类实例
这个问题源自前面对一个相关问题的讨论。简单的答案是,生成
str
的用户定义子类并不是最常见的情况,部分原因是用户定义的数据而不是字符串数据是可变的。当您必须处理这些问题时,可以想象您知道如何编写help(type(x))
,并且使用isinstance
而不是type(…)通常是正确的默认设置。(另一种方法是,如果您想像其他字符串一样使用它来选择帮助主题,那么必须使用help(str(x))
,但这肯定更少见。)可能在编写所有这些机制时,甚至不可能在python中对内置类型进行子类化。现在这是可能的,但通常不是您看到的,特别是对于基本类型,如str
和int
谢谢,使用help(type(x))
的提示很有用。你能说出这是在哪里记录的吗?@user3540774:这是由“使用help(str)获取str类的帮助”和类似help(socket.socket)的语句暗示的
您可能还不知道如何制作一个。这并不能解释为什么str子类的实例与str实例的处理方式不同。@user3540774:它们的处理方式不一样;这就是问题的全部。他们被区别对待,这就是问题的关键。在上面给出的示例中,help(“方法”)
和help(Cls1(“方法”)
给出了不同的响应。第一个给出了“方法”主题的帮助,第二个给出了“没有为‘方法’找到Python文档”