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