Python中如何自定义模块的字符串输出?
如何自定义Python模块的交互式输出字符串
当在Python交互式环境里输入已导入的模块名称并回车时,默认输出是这样的:
import pandas as pd pd <module 'pandas' from '....'>
我想给自定义模块改写这个输出,比如实现下面的效果:
<module 'mymodule' from '....'> my additional custom text
我之前在自定义模块mymodule里试过写这些代码,但都没效果:
第一种尝试:
def __str__(): print('my additional custom text')
第二种尝试:
def __str__(): return 'my additional custom text' def __repr__(): print("my additional custom text") return "my additional custom text"
虽然直接调用mymodule.__str__()能得到预期文本,但模块本身的交互式输出完全没变化。
解决方法
不能直接在模块里定义普通的__str__或__repr__函数,因为模块对象的这些特殊方法属于types.ModuleType类,得给模块对象本身绑定这些方法才行。
在你的mymodule.py里写这段代码:
import sys import types def module_repr(): # 先拿到模块默认的repr输出内容 default_repr = super(type(sys.modules[__name__]), sys.modules[__name__]).__repr__() # 拼接自定义文本后返回 return f"{default_repr}\nmy additional custom text" # 把自定义的方法绑定到当前模块对象上 sys.modules[__name__].__repr__ = types.MethodType(module_repr, sys.modules[__name__])
这样导入模块后,直接输入模块名称回车,就能得到你想要的带自定义文本的输出了。
为什么之前的方法没用?
模块对象的__repr__方法是由它的类ModuleType实现的,你在模块里定义的普通函数只是模块的属性,不会被Python当作对象的特殊方法调用。必须把函数绑定为模块对象的方法,才能覆盖默认的行为。
内容的提问来源于stack exchange,提问作者minivip
相关产品推荐
相关产品推荐

