1

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

4

2 回答 2

2

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

设置默认(键[,默认])

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

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

于 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 appendtoclass_dict[key]代替)。

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

于 2011-06-19T15:57:55.643 回答