python-3.x fastai.fastcore patch decorator vs simpe monkey-patching

cld4siwp  于 2023-03-31  发布在  Python
关注(0)|答案(1)|浏览(125)

我试图理解使用fastaifastcore.basics.patch_to装饰器的附加值。下面是fastcore的方法:

from fastcore.basics import patch_to

class _T3(int):
    pass

@patch_to(_T3)
def func1(self, a):
    return self + a

下面是简单的猴子修补方法:

class simple_T3(int):
    pass

def func1(self, a):
    return self + a

simple_T3.func1 = func1

检查这两个类并没有发现任何差异。我知道简单的monkey-patching可能会在更复杂的情况下导致问题,所以知道这些情况是什么是很好的?换句话说,fastcore.basics.patch_to的附加值是什么?

wbrvyc0a

wbrvyc0a1#

TL;DR

更多的调试信息,更好的IDE支持。

答案

patchpatch_to是fastai functools模块中的装饰器,有助于使monkey_patched方法看起来更像是最初放置在Class中的方法,这是经典的方式(双关语)。
如果你在一个类的外部创建一个函数,然后给它打猴子补丁,外部方法通常会有不同的属性,比如它的名字、模块和文档,与原始函数相比。这在调试或使用“外部”函数时会很混乱,而且没有帮助。
资料来源:官方文件:https://github.com/fastai/fastcore/blob/master/nbs/01_basics.ipynb

使用建议

考虑使用patch而不是patch_to,因为这样可以添加类型注解。

from fastcore.basics import patch

class _T3(int):
    pass

@patch
def func1(self: _T3, a):
    return self + a

如果我不想使用库怎么办?

学分:Kai Lichtenberg
fastcore本身重量极低:唯一使用的外部库是numpy(如果你的python〈3.7,则使用dataclasses)。
但如果您真的不想使用它,下面是一个只有两个内置依赖项的实现:
x一个一个一个一个x一个一个二个一个x一个一个三个一个

相关问题