在Python类字典中更改值时的NoneType

时间:2011-06-19 15:21:23

标签: python dictionary metaclass prepare

我正在尝试更改python类的字典,以便每次将一个函数对象添加到字典中时,我会添加一个我的类的实例,而我重新定义__call__。 我为元类使用自定义字典,在字典类的__setitem__中,我实例化了用于更改添加函数行为的类,并且我将非NoneType对象添加到字典中。但是,当我使用我正在包装的函数实例化类并尝试调用相应的函数时,我得到一个“NoneType not callable”错误,并且我在类字典中包含的函数对象是= None。任何想法为什么会这样?谢谢!

2 个答案:

答案 0 :(得分:2)

我不确定你做了什么,但你可能会发现setdefault有用:

  

setdefault(key [,default])

     
    

如果关键是     在字典中,返回其值。     如果没有,请插入值为的键     默认和返回默认值。默认     默认为无。

  

详细信息:Use cases for the 'setdefault' dict method

答案 1 :(得分: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'>})

现在,您想要实现多方法 - 我所做的修改排除了,因为每次调用__setitem__时都会覆盖您的多方法,因此您可以从那里开始工作(可能使用collections.defaultdict(list)和{ {1}}改为append

我可以提出一些建议吗?我不认为你需要一个元类 - http://www.artima.com/weblogs/viewpost.jsp?thread=101605为Python 2.x提供了一个非常简单的多方法实现。