Algorithm Pythonic方法处理网络数据结构的一种方法

Algorithm Pythonic方法处理网络数据结构的一种方法,algorithm,python,duck-typing,typechecking,Algorithm,Python,Duck Typing,Typechecking,那么,关于什么是蟒蛇的另一个问题!本例中的应用领域是网络算法(例如,节点、边、Dijkstra等),我以前只使用强类型语言编写过这种算法,在这种语言中,我们可以非常确定一切都是什么 同时,在Python中,我有一个类Net;此类的单个实例表示网络。我有一个类Edge,它为网络中的每个边缘实例化。每个Edge实例都有一个唯一的id 有时,我希望通过引用相关的edge实例来删除边。其他时候,我希望使用其id删除边缘。老实说,我开始忘记哪些变量是Edges,哪些是id。我认为我更喜欢C++来做这个工作

那么,关于什么是蟒蛇的另一个问题!本例中的应用领域是网络算法(例如,节点、边、Dijkstra等),我以前只使用强类型语言编写过这种算法,在这种语言中,我们可以非常确定一切都是什么

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

有时,我希望通过引用相关的
edge
实例来删除边。其他时候,我希望使用其
id
删除边缘。老实说,我开始忘记哪些变量是
Edges
,哪些是
id
。我认为我更喜欢C++来做这个工作:-P/P> 因此,我提出两个解决方案:

  • 开始使用systems匈牙利符号-更好地命名我的变量,以便我知道它们是实际的边对象还是我想要的边的id。实现强键入-使
    删除_edge
    (这是
    Net
    上的一种方法)明确拒绝任何不是
    边的内容。制作一个包装函数
    remove_-edge\u-id
    ,它从它的
    id
    中查找相关的
    edge
    ,然后调用
    remove_-edge
    ;此函数同样拒绝任何非
    id
    的内容

  • 使用duck类型。让
    remove_edge
    检查参数是
    id
    还是
    edge
    ,然后正确处理它


  • 大家怎么看呢?

    鸭子打字解决方案更像是蟒蛇。但是,与其测试参数以查看它是ID还是边,不如先将其视为更常见的情况,如果这不起作用,请尝试另一种方法

    如果确实使用显式类型检查(有时这是唯一的方法),请使用
    isintance()
    而不是
    type()
    ,这样它就可以处理子类


    变量的名称可以是好的,也可以是不好的,这与是否使用强类型是正交的。如果您有一些引用边缘ID的变量,还有一些引用边缘实例的变量,那么即使使用duck类型,以某种方式区分它们似乎也很明智。我会使用像
    edge
    edge\u id
    这样的语言,而不是匈牙利语。

    我会说两者的混合

    一个很好的做法是给对象命名,这样你就可以通过观察它们(大部分情况下)来判断它们是什么或者它们可能会做什么。我将命名我的边
    edge
    和我的边id
    edge\u id

    我可能会使用您的duck键入想法来删除边缘

    def remove_edge(edge):
        if isinstance(edge, int):
            edge = get_edge_from_id(edge)
        #delete edge here!!
    

    如果您知道如何通过id删除边缘,您可以简单地执行以下操作:

    class Net:
       def remove_edge(self, edge):
          try:
             self.remove_edge_by_id(edge.id)
          except AttributeError:     # oups, edge was not an Edge, it has no id
             self.remove_edge_by_id(edge)   # it should be an id
    

    只是我,还是会导致堆栈溢出?:-)也许值得退一步问问,为什么要同时使用对象引用和ID来跟踪边。它是从C++习惯中解放出来的吗?有没有可能修改其他东西,使其始终使用其中一种?你所指的是“图形”,而不是“网络”。公平点。我被应用领域的术语蒙蔽了双眼;-)听起来很合理,我认为这可能是确定的,但将问题留一段时间,以鼓励讨论+1代码说明如何按照@kindall的建议首先处理最常见的情况。更清楚一点!