我认为理解鸭子类型的想法,并希望在我的代码中更频繁地使用它。但是,我担心一个潜在的问题:名称冲突。
假设我想要一个对象做某事。我知道合适的方法,所以我简单地调用它,看看会发生什么。一般来说,有三种可能的结果:
找不到该方法并
AttributeError
引发异常。这表明该对象不是我认为的那样。没关系,因为使用鸭子打字我要么捕捉到这样的异常,要么我愿意让外部范围处理它(或让程序终止)。方法找到了,它正是我想要的,一切都很好。
方法找到了,但不是我想要的方法;它是来自完全不相关的类的同名方法。执行将继续,直到稍后检测到不一致的状态,或者在最坏的情况下,程序会默默地产生不正确的输出。
现在,我可以看到优质名称如何降低结果#3 的机会。但是项目被合并,代码被重用,库被交换,并且很可能在某些时候两个方法具有相同的名称并且完全不相关(即,它们不打算在多态中相互替代)。
我正在考虑的一个解决方案是添加方法名称的注册表。每个注册表记录将包含:
- 方法名称(唯一;即每个名称只有一条记录)
- 它的概括描述(即,适用于它可能被调用的任何实例)
- 它打算用于的一组类
如果将方法添加到新类,则需要将类添加到注册表(手动)。那时,程序员可能会注意到该方法是否与已经附加的含义不一致,并且如果需要,使用另一个名称。
每当调用方法时,程序会自动验证名称是否在注册表中,并且实例的类是记录中的类之一。如果不是,则会引发异常。
我知道这是一种非常繁重的方法,但在某些精度至关重要的情况下,我可以看到它可能很有用。是否尝试过(在 Python 或其他动态类型语言中)?有没有做类似事情的工具?还有其他值得考虑的方法吗?
注意:我不是指全局级别的名称冲突,避免命名空间污染是正确的方法。我指的是方法名称的冲突;这些不受名称空间的影响。