我正在尝试更改 python 类的字典,以便每次将函数对象添加到字典中时,我都会在其中重新定义类的实例__call__
。我为元类使用自定义字典,并在__setitem__
字典类中实例化用于更改添加函数的行为的类,并向字典添加非 NoneType 对象。但是,当我使用要包装的函数实例化类并尝试调用相应的函数时,我收到“NoneType not callable”错误,并且我在类字典中包装的函数对象是 = None。任何想法为什么会发生这种情况?谢谢!
问问题
1583 次
2 回答
2
我不确定你到底做了什么,但你可能会发现setdefault有用:
设置默认(键[,默认])
如果键在字典中,则返回其值。如果不是,则插入值为默认值的键并返回默认值。默认默认为无。
于 2011-06-19T15:36:48.880 回答
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)
and append
toclass_dict[key]
代替)。
我可以提出一些建议吗?我认为您不需要元类 - http://www.artima.com/weblogs/viewpost.jsp?thread=101605为 Python 2.x 提供了一个非常简单的多方法实现。
于 2011-06-19T15:57:55.643 回答