那么,关于什么是 Pythonic 的另一个问题!这种情况下的应用领域是网络算法(如节点、边、Dijkstra 之类的东西……),我以前只用强类型语言编写过一些代码,我们可以非常确定所有内容 是什么.
与此同时,在 Python 中,我有一个类 Net
;此类的单个实例代表一个网络。我有一个 Edge
类,它是为网络中的每个边缘实例化的。每个 Edge
实例都有一个唯一的 id
。
有时我希望通过引用相关的 Edge
实例来删除边。其他时候,我希望使用 id
删除 Edge。老实说,我开始忘记哪些变量是 Edges
,哪些是 ids
。我想我更喜欢 C++ 来完成这项工作 :-P
所以我提出两种解决方案:
开始使用系统匈牙利符号 - 更好地命名我的变量,以便我知道它们是实际的 Edge 对象还是我想要的 Edge 的 ID。实现强类型 - 使
remove_edge
(这是Net
上的一种方法)明确拒绝任何不是Edge
的内容。创建一个包装函数remove_edge_id
,它从id
中查找相关的Edge
,然后调用remove_edge
;此函数同样拒绝任何不是id
的内容。使用鸭子类型(duck typing)。让
remove_edge
检查参数是id
还是Edge
并用它做正确的事情。
大家怎么看?
最佳答案
duck-typing 解决方案更像 Pythonic。但是,与其测试参数以查看它是 ID 还是边缘,不如首先将其视为更常见的情况,如果这不起作用,请尝试另一种方式。
如果您确实使用显式类型检查(有时这是唯一的方法),请使用 isintance()
而不是 type()
以便它可以与子类一起使用。
变量可以命名得当,也可以命名不当,这与您是否使用强类型是正交的。如果您有一些引用 Edge ID 的变量,而其他引用 Edge 实例的变量,以某种方式区分它们似乎很聪明,即使您使用的是鸭子类型(duck typing)。不过,我会使用 edge
和 edge_id
而不是匈牙利语。
关于algorithm - 处理网络数据结构方法的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7919133/