NetworkX - Graph.nodes() 如何接收参数?

NetworkX - how is Graph.nodes() able to take in parameters?

当我在这里查看 Graph.nodes() 的代码时:https://github.com/networkx/networkx/blob/main/networkx/classes/graph.py#L658 它不接受任何参数。那么我怎么能够传递类似 data=True 的东西(例如,Graph.nodes(data=True))?理想情况下,我会收到“收到意外的关键字参数 'data'”错误。

它也被修饰为 属性,但我可以将其作为函数调用。这可能是一个基本的 python 问题,但这是我第一次遇到这个问题。

networkx放在一边。拿这个代码片段。

class CallableIterable:
    def __init__(self, val):
        self.val = val[:]

    def __call__(self, arg1=True):
        print('acting as a callable')
        return f'You called this with {arg1}'

    def __contains__(self, arg):
        print('acting as an iterable')
        return arg in self.val

class Graph:
    @property
    def nodes(self):
        return CallableIterable([1, 2, 3, 4, 5])

可以看到有两个classes CallableIterableGraphGraph 有一个 属性 nodes 调用时 return 是 CallableIterable 的一个实例。

创建 Graph g.

的实例

g = Graph()

现在您可以通过两种方式使用 属性 g.nodes

作为可迭代对象

print(1 in g.nodes)

这给

acting as an iterable
True

这是因为 in 触发了 CallableIterable class 的 __contains__ 方法(在这个例子中)。

可调用

print(g.nodes('some random value'))

这给

acting as a callable
You called this with some random value

这是因为它触发了CallableIterableclass的__call__方法。

() 中传递的参数,在这种情况下,'some random value' of g.nodes('some random value') 或者在你的情况下,data=True of Graph().nodes(data=True) 被传递给__call__ 的 return 值 属性 (which is g.nodes)NOT TO 属性修饰函数Graph.nodes.

在内部这是 g.nodes.__call__('some random value')

根据这种理解,将相同的原则应用于 networkx,其中 NodeView 是对象的类型 returned 而不是本例中看到的 CallableIterable,工作是一样的。

  1. nodes = NodeView(self)NodeView 的一个实例 class.
  2. 这个 class 有一个 __call__ and a __contains__ 方法。
  3. 这让您可以将其用作可调用/函数 (Graph().nodes(data=True))) 并作为可迭代对象 ('something' in Graph().nodes).

NodeView class 除了 __call____contains__ 之外还有其他函数,每个函数都会被适当调用。

这基本上就是文档字符串对以下内容的含义

    Can be used as `G.nodes` for data lookup and for set-like operations.
    Can also be used as `G.nodes(data='color', default=None)` to return a
    NodeDataView which reports specific node data but no set operations