繁体   English   中英

NetworkX Graph对象不可下标

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM