Ironpython: функция работает в CPython, загадочное исключение нулевого указателя в IronPython

Я пытаюсь сделать что-то, что кажется очень простым и не выходит за рамки стандартного Python. Следующая функция принимает набор наборов и возвращает все элементы, содержащиеся в двух или более наборах.

Для этого, пока набор наборов не пуст, он просто извлекает один набор из набора, пересекает его с оставшимися наборами и обновляет набор элементов, попадающих в одно из этих пересечений.

def cross_intersections(sets):
    in_two = set()
    sets_copy = copy(sets)
    while sets_copy:
        comp = sets_copy.pop()
        for each in sets_copy:
            new = comp & each
            print new,         # Print statements to show that these references exist
            print in_two
            in_two |= new      #This is where the error occurs in IronPython
    return in_two

Выше приведена функция, которую я использую. Чтобы проверить это, в CPython работает следующее:

>>> a = set([1,2,3,4])
>>> b = set([3,4,5,6])
>>> c = set([2,4,6,8])

>>> cross = cross_intersections([a,b,c])
set([2, 4]) set([])
set([4, 6]) set([2, 4])
set([3, 4]) set([2, 4, 6])
>>> cross
set([2, 3, 4, 6])

Однако, когда я пытаюсь использовать IronPython:

>>> b = cross_intersections([a,b,c])
set([2, 4]) set([])
set([4, 6]) set([2, 4])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:/path/to/code.py", line 10, in cross_intersections
SystemError: Object reference not set to an instance of an object.

В заголовке я сказал, что это загадочное исключение нулевого указателя. Я, вероятно, понятия не имею, как .NET обрабатывает нулевые указатели (я никогда не работал с C-подобным языком и использую IronPython всего месяц или около того), но если я правильно понимаю, это происходит, когда вы пытаетесь получить доступ к некоторому свойству объекта, которое указывает на null.

В этом случае ошибка возникает в строке 10 моей функции: in_two |= new. Однако я поставил операторы print прямо перед этой строкой, которые (по крайней мере для меня) указывают, что ни один из этих объектов не указывает на null.

Где я ошибаюсь?


person Wilduck    schedule 15.07.2011    source источник
comment
Похоже, это ошибка: ironpython.codeplex.com/workitem/30386. Должен быть уже закреплен в багажнике.   -  person Paolo Moretti    schedule 15.07.2011
comment
Похоже на то. Мне было интересно, может ли это быть так, но я никогда не хотел обвинять окружающую среду. Поместите это как ответ, и я приму это.   -  person Wilduck    schedule 15.07.2011


Ответы (2)


Это ошибка. Это будет исправлено в 2.7.1, но я не думаю, что это исправление есть в выпуске 2.7.1 Beta 1.

person Jeff Hardy    schedule 15.07.2011

Это ошибка, которая все еще присутствует в выпуске 2.7.1 Beta 1.

Это исправлено в master, и это исправление будет включено в следующий выпуск.

IronPython 3.0 (3.0.0.0) on .NET 4.0.30319.235
Type "help", "copyright", "credits" or "license" for more information.
>>> import copy
>>>
>>> def cross_intersections(sets):
...     in_two = set()
...     sets_copy = copy.copy(sets)
...     while sets_copy:
...         comp = sets_copy.pop()
...         for each in sets_copy:
...             new = comp & each
...             print new,     # Print statements to show that these references exist
...             print in_two
...             in_two |= new  # This is where the error occurs in IronPython
...     return in_two
...
>>>
>>> a = set([1,2,3,4])
>>> b = set([3,4,5,6])
>>> c = set([2,4,6,8])
>>>
>>> cross = cross_intersections([a,b,c])
set([2, 4]) set([])
set([4, 6]) set([2, 4])
set([3, 4]) set([2, 4, 6])
person Paolo Moretti    schedule 15.07.2011