繁体   English   中英

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

[英]NoneType when changing a value in Python class dictionary

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

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

setdefault(key [,default])

如果key在字典中,则返回其值。 如果不是,请插入值为default的值并返回default。 默认默认为无。

详细信息: 'setdefault'dict方法的用例

在我开始之前 - 发布的代码是您的实际代码吗? 它在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)appendclass_dict[key]代替)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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