Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python帮助类将str类的子类解释为模块名?_Python_Pydoc - Fatal编程技术网

为什么python帮助类将str类的子类解释为模块名?

为什么python帮助类将str类的子类解释为模块名?,python,pydoc,Python,Pydoc,当使用字符串类型的参数调用python help函数时,pydoc.Helper.help将其解释为请求有关由字符串值标识的主题、符号、关键字或模块的信息。对于其他参数,将提供有关对象本身的帮助,除非该对象是str子类的实例。在后一种情况下,pydoc.resolve函数查找名称与对象值匹配的模块,如果没有找到,则引发异常 为了说明这一点,考虑示例代码: class Extra(object): def NewMethod(): return 'New' Cls1 = type

当使用字符串类型的参数调用python help函数时,
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文档”