NoneType при изменении значения в словаре классов Python - PullRequest
1 голос
/ 19 июня 2011

Я пытаюсь изменить словарь класса Python, чтобы каждый раз, когда в словарь добавлялся объект функции, я добавлял экземпляр своего класса, в котором вместо этого я переопределял __call__. Я использую пользовательский словарь для метакласса и в __setitem__ класса словаря я создаю экземпляр класса, который я использую для изменения поведения добавленных функций, и я добавляю объект не NoneType в словарь. Однако, когда я создаю экземпляр класса с помощью функций, которые я обертываю, и пытаюсь вызвать соответствующую функцию, я получаю ошибку «NoneType not callable», и объект функции, который я обернул в словарь класса, = None. Есть идеи, почему это может произойти? Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 июня 2011

Перед тем, как начать - действительно ли опубликованный код является вашим реальным кодом?Это на самом деле не работает для меня в 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) и append до class_dict[key]).

Могу ли япредложить что-нибудь?Я не думаю, что вам нужен метакласс - http://www.artima.com/weblogs/viewpost.jsp?thread=101605 обеспечивает реализацию мультиметода для Python 2.x, это очень просто.

2 голосов
/ 19 июня 2011

Я не уверен, что именно вы сделали, но вы можете найти setdefault полезным:

setdefault (клавиша [, по умолчанию])

Если ключ в словаре вернуть его значение. Если нет, введите ключ со значением по умолчанию и вернуть по умолчанию. дефолт по умолчанию Нет.

Подробная информация: Варианты использования для метода dict 'setdefault'

...