编程语言
首页 > 编程语言> > python – 鸭子打字:如何避免名字冲突?

python – 鸭子打字:如何避免名字冲突?

作者:互联网

我认为理解鸭子打字的想法,并希望在我的代码中更频繁地使用它.但是,我担心一个潜在的问题:名称冲突.

假设我想要一个对象做某事.我知道适当的方法,所以我只是调用它,看看会发生什么.一般来说,有三种可能的结果:

>找不到该方法,并引发AttributeError异常.这表明该对象不是我认为的对象.这很好,因为使用duck typing我要么捕获这样的异常,要么我愿意让外部范围处理它(或让程序终止).
>找到方法,它正是我想要的,一切都很棒.
>找到了方法,但这不是我想要的方法;它是一个完全不相关的类的同名方法.执行继续,直到稍后检测到不一致状态,或者在最坏的情况下,程序默默地产生不正确的输出.

现在,我可以看到高质量的名字如何降低结果的可能性#3.但是项目被组合,代码被重用,库被交换,并且很可能在某些时候两个方法具有相同的名称并且完全不相关(即,它们不打算在多态中相互替换).

我正在考虑的一个解决方案是添加方法名称的注册表.每个注册表记录将包含:

>方法名称(唯一;即每个名称只有一条记录)
>它的通用描述(即,适用于可能被调用的任何实例)
>要用于的类集

如果将方法添加到新类,则需要将该类添加到注册表中(手动).那时,程序员可能会注意到该方法是否与已附加的含义不一致,如有必要,请使用其他名称.

无论何时调用方法,程序都会自动验证名称是否在注册表中,并且实例的类是记录中的类之一.如果没有,将引发异常.

我知道这是一个非常繁重的方法,但在某些情况下,精度至关重要,我可以看到它可能是有用的.是否已尝试过(使用Python或其他动态类型语言)?是否有任何工具可以做类似的事情?还有其他值得考虑的方法吗?

注意:我不是指全球范围内的名称冲突,避免命名空间污染将是正确的方法.我指的是方法名称的冲突;这些不受名称空间的影响.

解决方法:

好吧,如果这很关键,你可能不应该使用鸭子打字……

在实践中,程序是有限的系统,并且传递到任何特定例程的可能类型的范围不会导致您担心的问题(通常只传递一种类型).

但是如果你想要解决这个问题,python提供了ABCs(抽象基类).这些允许您将“类型”与任何方法集相关联,因此可以像您建议的那样使用注册表(您可以以正常方式从ABC继承,或者只是“注册”它).

然后,您可以手动检查这些类型,或使用pytyp中的装饰器自动检查.

但是,尽管是pytyp的作者,并且发现这些问题很有趣,但我个人并不认为这种方法很有用.在实践中,你所担心的事情根本不会发生(如果你想担心某些事情,那么在使用更高阶函数时,请注意缺少类型文档!).

PS note – ABCs纯粹是元数据.他们不强制执行任何事情.另外,使用pytyp装饰器检查是非常低效的 – 你真的只想在关键时刻这样做.

标签:python,language-agnostic,dynamic-typing,duck-typing
来源: https://codeday.me/bug/20190626/1291161.html