algorithm - 处理网络数据结构方法的 Pythonic 方式

标签 algorithm python duck-typing typechecking

那么,关于什么是 Pythonic 的另一个问题!这种情况下的应用领域是网络算法(如节点、边、Dijkstra 之类的东西……),我以前只用强类型语言编写过一些代码,我们可以非常确定所有内容 是什么.

与此同时,在 Python 中,我有一个类 Net;此类的单个实例代表一个网络。我有一个 Edge 类,它是为网络中的每个边缘实例化的。每个 Edge 实例都有一个唯一的 id

有时我希望通过引用相关的 Edge 实例来删除边。其他时候,我希望使用 id 删除 Edge。老实说,我开始忘记哪些变量是 Edges,哪些是 ids。我想我更喜欢 C++ 来完成这项工作 :-P

所以我提出两种解决方案:

  1. 开始使用系统匈牙利符号 - 更好地命名我的变量,以便我知道它们是实际的 Edge 对象还是我想要的 Edge 的 ID。实现强类型 - 使 remove_edge(这是 Net 上的一种方法)明确拒绝任何不是 Edge 的内容。创建一个包装函数 remove_edge_id,它从 id 中查找相关的 Edge,然后调用 remove_edge;此函数同样拒绝任何不是 id 的内容。

  2. 使用鸭子类型(duck typing)。让 remove_edge 检查参数是 id 还是 Edge 并用它做正确的事情。

大家怎么看?

最佳答案

duck-typing 解决方案更像 Pythonic。但是,与其测试参数以查看它是 ID 还是边缘,不如首先将其视为更常见的情况,如果这不起作用,请尝试另一种方式。

如果您确实使用显式类型检查(有时这是唯一的方法),请使用 isintance() 而不是 type() 以便它可以与子类一起使用。

变量可以命名得当,也可以命名不当,这与您是否使用强类型是正交的。如果您有一些引用 Edge ID 的变量,而其他引用 Edge 实例的变量,以某种方式区分它们似乎很聪明,即使您使用的是鸭子类型(duck typing)。不过,我会使用 edgeedge_id 而不是匈牙利语。

关于algorithm - 处理网络数据结构方法的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7919133/

相关文章:

python - 从 pie matplotlib 饼图中获取图例中的百分比

python - 如何向类的用户解释其属性之一的预期类型?

algorithm - 计算机编程艺术中approximatelyEqual和essentiallyEqual的区别

javascript - 如何消除按位循环并将字节作为一个整体处理?

python - 当嵌入式 Python 解释器第二次尝试导入外部模块时,C++ 应用程序崩溃

coldfusion - ColdFusion 中的鸭式输入

python - 模块 "duck typing"有陷阱吗?

c - 任意位计数器

c++ - 枚举完整图的哈密顿循环的算法(循环、反转、环绕或重复不计算在内的排列)

python - 将 PyQt 与 sql orm 库(sqlalchemy、peewee 等)集成