在Python类字典中更改值时出现NoneType

1 投票
2 回答
2025 浏览
提问于 2025-04-16 19:52

我想改变一个Python类的字典,让每次往字典里添加一个函数对象的时候,实际上是添加我这个类的一个实例,并且在这个实例里重新定义了__call__方法。为了实现这个,我使用了一个自定义的字典作为元类,并在字典类的__setitem__方法里实例化我用来改变添加函数行为的类,然后把一个不是None的对象添加到字典里。然而,当我用我包裹的函数实例化这个类,并尝试调用相应的函数时,我遇到了“NoneType not callable”的错误,结果我在类字典里包裹的函数对象变成了None。你们觉得这可能是什么原因呢?谢谢!

2 个回答

2

我不太确定你具体做了什么,但你可能会觉得setdefault这个方法很有用:

setdefault(key[, default])

如果字典里有这个key,就返回它的值。
如果没有,就用这个key插入一个默认值,并返回这个默认值。默认值是None。

详细信息可以查看:'setdefault'字典方法的使用案例

2

在我开始之前,想问一下,你发的代码是你实际使用的代码吗?在Python 3.2下,我试了试,发现它并不能正常工作。我对它做了一些修正。首先,我改了这些地方:

class_dict = list()

现在变成了

class_dict = {}

OverloadedFunction.__call__ 里:

for fkey, function in class_dict.items():
    inspect_t = inspect.getfullargspec(function)
    print(inspect_t)

member_dict.__setitem__ 里:

if value.__class__.__name__ == "function":
    class_dict[key] = value
    dict.__setitem__(self,key,OverloadedFunction(key,value))

我觉得这就是你想要的。我从来没有遇到过 NoneType not callable 的错误——在这些修改之后(再加上在最上面加上 import inspect),你的代码可以正常工作,并且打印出参数的规格:

$ python3 temp.py
FullArgSpec(args=['self', 'a', 'b'], varargs=None, varkw=None, defaults=None, kwonlyargs=[],    kwonlydefaults=None, annotations={'a': <class '__main__.Asteroid'>, 'b': <class '__main__.Asteroid'>})

现在,你想实现多方法(multimethod)——我做的这些修改会影响到这一点,因为你的多方法在每次调用 __setitem__ 时都会被覆盖,所以你可以从这里入手(也许可以使用 collections.defaultdict(list)append 来添加到 class_dict[key] 中)。

我可以给你提个建议吗?我觉得你不需要使用元类(metaclass)——http://www.artima.com/weblogs/viewpost.jsp?thread=101605 提供了一个非常简单的Python 2.x的多方法实现。

撰写回答