gpt4 book ai didi

python - NetworkX 图形对象不可订阅

转载 作者:行者123 更新时间:2023-12-01 04:41:05 24 4
gpt4 key购买 nike

我试图在不输入内容的情况下对 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]

并且我收到每个键的错误“'type'对象不可下标”。如何使用循环猴子修补所有方法?

最佳答案

分析您当前的方法

您正在通过方括号使用下标表示法。通常,您会输入 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 的 future 版本将避免使用您选择进行猴子修补的相同方法名称。

其次,猴子修补会阻止您编写可重用的代码。其他开发人员不再可能重用您的便利功能,除非他们自己修补他们的代码,并且可能存在不可预见的原因阻止这种情况成为可能。

实用建议

不要这样做。我必须警告您,猴子修补库代码的风格非常糟糕,只能作为最后的手段使用编程(例如,如果它对业务收入或其相关资源(例如开发时间)产生积极且可衡量的影响)。

您希望解决的根本问题是什么?我愿意跟进替代解决方案来解决您可能存在的每个潜在问题。

此外,您是否考虑过定义包含辅助函数的辅助模块的简单方法,例如:

# Module graph_utils

def is_nonnull(graph):
return bool(graph.nodes())

其他说明

Python 已经有一个处理 bool 上下文的约定:任何被认为是空的东西也应该被认为是 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.')

关于python - NetworkX 图形对象不可订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30696918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com