我试图理解使用fastai
的fastcore.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
的附加值是什么?
1条答案
按热度按时间wbrvyc0a1#
TL;DR
更多的调试信息,更好的IDE支持。
答案
patch
和patch_to
是fastai functools模块中的装饰器,有助于使monkey_patched方法看起来更像是最初放置在Class中的方法,这是经典的方式(双关语)。如果你在一个类的外部创建一个函数,然后给它打猴子补丁,外部方法通常会有不同的属性,比如它的名字、模块和文档,与原始函数相比。这在调试或使用“外部”函数时会很混乱,而且没有帮助。
资料来源:官方文件:https://github.com/fastai/fastcore/blob/master/nbs/01_basics.ipynb
使用建议
考虑使用
patch
而不是patch_to
,因为这样可以添加类型注解。如果我不想使用库怎么办?
学分:Kai Lichtenberg
fastcore本身重量极低:唯一使用的外部库是numpy(如果你的python〈3.7,则使用dataclasses)。
但如果您真的不想使用它,下面是一个只有两个内置依赖项的实现:
x一个一个一个一个x一个一个二个一个x一个一个三个一个