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

标签 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 函数试图找到一个名为“方法”。

这意味着很难为 str 的用户定义子类提供有效的文档。 pydoc.resolve 是否不可能像在 pydoc.Helper.help 中那样使用对象类型的测试,并允许用户定义的实例子类被视为其他类实例?

这个问题来自先前对相关问题的讨论 here .

最佳答案

简单的答案是,创建 str 的用户定义子类并不是最常见的情况——部分原因是用户定义的数据而非字符串数据是可变的。当你必须处理这些问题时,你已经知道如何编写 help(type(x)),并使用 isinstance 而不是 type( …) is … 通常是正确的默认值。 (换句话说,如果您想像使用任何其他字符串一样使用 help(str(x))选择一个帮助主题,但这肯定更罕见。)

关于python - 为什么 python 帮助类将 str 类的子类解释为模块名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59458390/

相关文章:

python - 收到 xml 解析的 None 响应后如何继续

python - 为什么不能在 for 循环中使用类型提示?

python - 在运行时在 wxPython 中添加复选框

python - 为什么我在 string.replace() 上得到 "AttributeError: ' 模块对象没有属性 'replace'“

python - pydoc.render_doc() 添加字符 - 如何避免这种情况?

python - pydoc.doc 无法检索到 "os.path.sep"

python - 为什么当我使用 argparse 时 pydoc 不起作用?

python - 如何使用 python 为 janusgraph 设置模式以进行批量加载

python - pydoc 支持 python 元数据,例如 __version__ = '0.1'