4 votes

Ironpython : La fonction fonctionne en CPython, exception mystérieuse de pointeur nul en IronPython

J'essaie de faire quelque chose qui semble très simple et qui relève de la norme Python. La fonction suivante prend une collection d'ensembles, et renvoie tous les éléments qui sont contenus dans deux ensembles ou plus.

Pour ce faire, tant que la collection d'ensembles n'est pas vide, il suffit de sortir un ensemble de la collection, de l'intersecter avec les ensembles restants et de mettre à jour un ensemble d'éléments qui se trouvent dans l'une de ces intersections.

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

Ci-dessus, la fonction que j'utilise. Pour la tester, dans CPython, ce qui suit fonctionne :

>>> 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])

Cependant, lorsque j'essaie d'utiliser 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.

Dans le titre, j'ai dit qu'il s'agissait d'une mystérieuse exception de pointeur nul. Je n'ai probablement aucune idée de la façon dont .NET gère les pointeurs nuls (je n'ai jamais travaillé avec un langage de type C et je n'utilise IronPython que depuis un mois environ), mais si je comprends bien, cela se produit lorsque vous tentez d'accéder à une propriété d'un objet qui pointe sur null .

Dans ce cas, l'erreur se produit à la ligne 10 de ma fonction : in_two |= new . Cependant, j'ai mis print juste avant cette ligne qui (du moins pour moi) indique qu'aucun de ces objets ne pointe vers l'objet null .

Où est-ce que je me trompe ?

3voto

Jeff Hardy Points 5310

C'est un bug . Il sera corrigé dans la version 2.7.1, mais je ne pense pas que le correctif soit dans la version 2.7.1 Beta 1.

1voto

Paolo Moretti Points 9519

Il s'agit d'un bogue toujours présent dans la version 2.7.1 Beta 1.

Il a été corrigé dans maître et le correctif sera inclus dans la prochaine version.

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])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X