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 CallableIterable
和Graph
。 Graph
有一个 属性 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
这是因为它触发了CallableIterable
class的__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
,工作是一样的。
nodes = NodeView(self)
是 NodeView
的一个实例
class.
- 这个 class 有一个
__call__
and a __contains__
方法。
- 这让您可以将其用作可调用/函数
(
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
当我在这里查看 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 CallableIterable
和Graph
。 Graph
有一个 属性 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
这是因为它触发了CallableIterable
class的__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
,工作是一样的。
nodes = NodeView(self)
是NodeView
的一个实例 class.- 这个 class 有一个
__call__
and a__contains__
方法。 - 这让您可以将其用作可调用/函数
(
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