gpt4 book ai didi

python - 如何替换函数的 __str__

转载 作者:太空狗 更新时间:2023-10-29 22:07:58 26 4
gpt4 key购买 nike

我想将 python 函数的字符串表示更改为函数名称。

例如某些功能

def blah(x):
...

str(blah) 当前给出

<function blah at 0x10127b578>

所以我这样替换 __str__:

blah.__str__=lambda: 'blah'

但它不会被 str(blah) 调用。

是否可以更改函数的 __str__

最佳答案

像那样替换 __str__ 实际上对任何类型的对象都不起作用。内置函数类型并不特殊:

>>> class Foo(object):
pass

>>> f = Foo()
>>> f.__str__ = lambda: 'f'
>>> str(f)
'<__main__.Foo object at 0x0000000002D13F28>'
>>> f.__str__()
'f'

str 内置函数不通过通常的查找协议(protocol)查找 __str__,它直接跳到查看其参数的类。所以你不能“覆盖”单个对象上的 __str__ 方法;你必须在一个类上设置它才能应用于该类的所有对象。1

但话又说回来,内置函数类型并不特殊。您可以创建一个行为最像函数的类,然后使用它:

class Function(object):
def __init__(self, raw_function):
self.raw_function = raw_function
def __call__(self, *args, **kwargs):
return self.raw_function(*args, **kwargs)
def __str__(self):
return self.raw_function.__name__

__call__ 方法意味着您可以像调用函数一样调用此类的对象。这一个只是将它接收到的任何参数直接传递给底层原始函数并返回它返回的任何东西(或抛出它抛出的任何异常)。由于此类将单个函数作为参数,因此它也符合装饰器的模式:

@Function
def blah(x):
return x + 1

有了那个:

>>> blah
<__main__.Function object at 0x0000000002D13EB8>
>>> str(blah)
'blah'
>>> blah(33)
34

1 内置函数类型在某些方面是特殊的(我撒谎了),其中之一是您不能分配给它的属性(这是 本身,而不是任何特定函数对象的属性)。因此,在您认为如果您可以对内置函数类型进行 monkeypatch 以便 str所有 函数上以您想要的方式工作可能会很棒,那是行不通的。这可能是最好的;修改像内置函数类型这样全局和基本的东西将是发明一些非常奇怪的错误的好方法。

关于python - 如何替换函数的 __str__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22797580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com