【发布时间】:2016-06-03 14:15:37
【问题描述】:
我希望能够更改__str__() 的输出,并希望为此添加**kwargs。
问题:似乎无法更改函数的签名。
例如:
#!/usr/bin/env python3
class my_printable_obj(object):
def __init__(self, s):
self.content = s
def __str__(self, **kwargs):
fancy = kwargs.get('fancy', '')
return str(self.content) + fancy
M = my_printable_obj("Something to print")
print(str(M))
print(str(M, fancy=' + a fancy part'))
输出:
$ ./test_script3str.py
Something to print
Traceback (most recent call last):
File "./test_script3str.py", line 17, in <module>
print(str(M, fancy=' + a fancy part'))
TypeError: 'fancy' is an invalid keyword argument for this function
我注意到,尽管有 TypeError 消息,python 确实使用了my_printable_obj.__str__()(在__str__() 的开头添加一个print('here') 可以轻松观察到这一点)。
是否有解决方案,或者由于某种原因不可能?那么我是否应该更好地定义另一个函数,例如 into_str(self, **kwargs) 并使用 M.into_str(fancy=' something more') 而不是 __str__()?
注意:写这个:
def __str__(self, fancy=''):
return str(self.content) + fancy
给出完全相同的错误。
【问题讨论】:
-
您可以将
**kwargs添加到.__str__()的实现中,但不能添加到str()的标准实现中。考虑使用具有更宽接口的单独方法,例如.fancyStr();你也可以让.__str__()调用它。 -
是的,但我可以使用像
str(M, fancy=' + a fancy part')这样的东西吗?我的意思是,那时可以调用str(M),但我必须直接使用M.fancyStr(fancy='...')才能使用这个kwarg? -
如果您想根据对象的属性呈现单独的字符串,我会使用单独的方法。如果您不关心对象的属性,我会完全在对象之外进行,也许使用装饰器模式,也许只使用纯字符串连接。我不确定您为什么要将每个人对
str()的期望更改为您的具体示例:) -
您可以制作自己的
str(mystr) 版本,它接受参数并将它们传递给__str__。
标签: python string python-3.x signature keyword-argument