Algorithm Pythonic方法处理网络数据结构的一种方法
那么,关于什么是蟒蛇的另一个问题!本例中的应用领域是网络算法(例如,节点、边、Dijkstra等),我以前只使用强类型语言编写过这种算法,在这种语言中,我们可以非常确定一切都是什么 同时,在Python中,我有一个类Algorithm Pythonic方法处理网络数据结构的一种方法,algorithm,python,duck-typing,typechecking,Algorithm,Python,Duck Typing,Typechecking,那么,关于什么是蟒蛇的另一个问题!本例中的应用领域是网络算法(例如,节点、边、Dijkstra等),我以前只使用强类型语言编写过这种算法,在这种语言中,我们可以非常确定一切都是什么 同时,在Python中,我有一个类Net;此类的单个实例表示网络。我有一个类Edge,它为网络中的每个边缘实例化。每个Edge实例都有一个唯一的id 有时,我希望通过引用相关的edge实例来删除边。其他时候,我希望使用其id删除边缘。老实说,我开始忘记哪些变量是Edges,哪些是id。我认为我更喜欢C++来做这个工作
Net
;此类的单个实例表示网络。我有一个类Edge
,它为网络中的每个边缘实例化。每个Edge
实例都有一个唯一的id
有时,我希望通过引用相关的edge
实例来删除边。其他时候,我希望使用其id
删除边缘。老实说,我开始忘记哪些变量是Edges
,哪些是id
。我认为我更喜欢C++来做这个工作:-P/P>
因此,我提出两个解决方案:
删除_edge
(这是Net
上的一种方法)明确拒绝任何不是边的内容。制作一个包装函数remove_-edge\u-id
,它从它的id
中查找相关的edge
,然后调用remove_-edge
;此函数同样拒绝任何非id
的内容
remove_edge
检查参数是id
还是edge
,然后正确处理它大家怎么看呢?鸭子打字解决方案更像是蟒蛇。但是,与其测试参数以查看它是ID还是边,不如先将其视为更常见的情况,如果这不起作用,请尝试另一种方法 如果确实使用显式类型检查(有时这是唯一的方法),请使用
isintance()
而不是type()
,这样它就可以处理子类
变量的名称可以是好的,也可以是不好的,这与是否使用强类型是正交的。如果您有一些引用边缘ID的变量,还有一些引用边缘实例的变量,那么即使使用duck类型,以某种方式区分它们似乎也很明智。我会使用像
edge
和edge\u id
这样的语言,而不是匈牙利语。我会说两者的混合
一个很好的做法是给对象命名,这样你就可以通过观察它们(大部分情况下)来判断它们是什么或者它们可能会做什么。我将命名我的边edge
和我的边idedge\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的建议首先处理最常见的情况。更清楚一点!