[英]NetworkX Graph object not subscriptable
我试图在不键入内容的情况下猴子修补NetworkX Graph对象
networkx.Graph.method_name = method_name
对于我定义的每个方法。 我尝试了这个(最低版本):
import networkx
class _GraphExtended (networkx.Graph):
def is_nonnull(self):
return bool(self.nodes())
for key in _GraphExtended.__dict__:
nx.Graph[key] = _GraphExtended[key]
并且我收到每个键的错误“'类型'对象不可下标”。 如何使用循环猴子修补所有方法?
您通过方括号使用下标表示法。 通常,您将键入my_object[key]
,它作为第一近似 *转换为my_object.__getitem__(key)
。
特别是,如果type(my_object)
没有定义__getitem__
属性,那么您实际上会得到一条错误消息,指出type(my_object)
无法下标。
在您的情况下, type(_GraphExtended) == type
成立。 此外, type
类未定义任何__getitem__
属性。 因此,这就是为什么您收到错误消息,指出该type
不可下标。
*出于完整性考虑,更准确的翻译应遵循以下方式: object.__getattribute__(my_object, '__getitem__')(key)
。
您可能想要的是设置networkx.Graph
对象的'method_name'
属性。 通常,这可以通过使用setattr
内置函数来完成,如下所示:
setattr(networkx.Graph, key, value)
此外, _GraphExtended.__dict__
包含的密钥比您打算猴子修补的要多得多。 您也许可以过滤掉以双下划线开头和结尾的代码,但是我既不确定此过滤器在所有情况下均有效,也不确信它与Python正向兼容。
首先,猴子修补可能会破坏与networkx库的前向兼容性。 无法保证将来的networkx版本将避免使用选择用于猴子补丁的相同方法名称。
其次,猴子补丁将阻止您编写可重用的代码。 除非其他开发人员自己猴子修补其代码,否则其他开发人员将不再可能重用您的便利功能,并且可能有不可预见的原因阻止了这种可能性。
不要做 我必须警告您,猴子补丁库代码的样式非常糟糕,只能用作编程领域的不得已的手段(例如,如果它对业务收入或相关资源产生积极且可衡量的影响,例如作为开发时间)。
您要解决的基本问题是什么? 我愿意提供替代解决方案,以解决您可能遇到的每个基本问题。
另外,您是否考虑过定义包含帮助程序功能的帮助程序模块的简单方法,例如:
# Module graph_utils
def is_nonnull(graph):
return bool(graph.nodes())
Python已经有一个处理布尔上下文的约定:任何被认为是空的也应该被认为是False。 例如,根据networkx文档, Graph
类定义了一个__len__
方法,该方法返回节点数。 由于__len__
,Python允许在期望bool
上下文中使用Graph
对象。 例如,
graph = networkx.Graph()
print(not graph) # Prints True iff len(graph) == 0
if graph:
print('Graph is nonnull.')
else:
print('Graph is null.')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.