[Grok-dev] Upgrade problem "type object 'IRole' has no attribute '__iro__'"

Sebastian Ware sebastian at urbantalk.se
Wed May 28 09:51:48 EDT 2008


Catching the exception was a temporary solution:

     def add_extendor(self, provided):
         _extendors = self._extendors
         try:
             for i in provided.__iro__:
                 extendors = _extendors.get(i, ())
                 _extendors[i] = (
                     [e for e in extendors if provided.isOrExtends(e)]
                     +
                     [provided]
                     +
                     [e for e in extendors if not  
provided.isOrExtends(e)]
                     )
         except AttributeError:
             pass

But, I am guessing there are other problems connected to this because  
I get other failures when I have logged in (cookieLifetime was one of  
them).

Anyway, I hope there is a solution to this problem. Fortunately I am  
not too pressed for time, but the work around (exporting all the data  
an reimporting it into a fresh application) isn't a great option.

Mvh Sebastian

28 maj 2008 kl. 15.32 skrev Sebastian Ware:

> This is the code where the problem occurs:
>
>    def init_extendors(self):
>        self._extendors = {}
>        for p in self._registry._provided:
>            self.add_extendor(p)
>
>    def add_extendor(self, provided):
>        _extendors = self._extendors
>        for i in provided.__iro__:   <======= THIS IS WHERE THE ERROR  
> OCCURS!
>            extendors = _extendors.get(i, ())
>            _extendors[i] = (
>                [e for e in extendors if provided.isOrExtends(e)]
>                +
>                [provided]
>                +
>                [e for e in extendors if not provided.isOrExtends(e)]
>                )
>
>    def remove_extendor(self, provided):
>        _extendors = self._extendors
>        for i in provided.__iro__:
>            _extendors[i] = [e for e in _extendors.get(i, ())
>                             if e != provided]
>
> I have tracked down the code that should set this in [class  
> Specification] (zope/interface/interface.py). Maybe I could solve  
> this problem if I somehow could tell all the offending objects that  
> they have changed (I am guessing the problem is related to more than  
> one object). But how?
>
> class Specification(SpecificationBase):
>
>    [snip]
>
>    def changed(self, originally_changed):
>        """We, or something we depend on, have changed
>        """
>
>        implied = self._implied
>        implied.clear()
>
>        ancestors = ro(self)
>
>        try:
>            if Interface not in ancestors:
>                ancestors.append(Interface)
>        except NameError:
>            pass # defining Interface itself
>
>        self.__sro__ = tuple(ancestors)
>        self.__iro__ = tuple([ancestor for ancestor in ancestors
>                              if isinstance(ancestor, InterfaceClass)
>                              ])
>
>        for ancestor in ancestors:
>            # We directly imply our ancestors:
>            implied[ancestor] = ()
>
>        # Now, advise our dependents of change:
>        for dependent in self.dependents.keys():
>            dependent.changed(originally_changed)
>
>
> Mvh Sebastian
>
> 28 maj 2008 kl. 12.43 skrev Sebastian Ware:
>
>> My problem is that this prevents me from updating my customers  
>> project without exporting and importing all the data, something  
>> that isn't very easy at the current state of Grok.
>>
>> I hope someone can give me some hints on this.
>>
>> Mvh Sebastian
>>
>> 28 maj 2008 kl. 12.02 skrev Wichert Akkerman:
>>
>>> Previously Sebastian Ware wrote:
>>>> When upgrading a live grok-0.10 app to grok-0.12 I get the  
>>>> following
>>>> error:
>>>>
>>>> AttributeError: type object 'IRole' has no attribute '__iro__'
>>>>
>>>> I am guessing it has to do with the move of zope.securitypolicy,  
>>>> but
>>>> how do I resolve this?
>>>
>>> The last few times I've seen that __iro__ error it apparently had
>>> something to do with persisted interface. I've never been able to  
>>> find a
>>> fix for it, or reliably reproduce it.
>>>
>>> Wichert.
>>>
>>> -- 
>>> Wichert Akkerman <wichert at wiggy.net>    It is simple to make things.
>>> http://www.wiggy.net/                   It is hard to make things  
>>> simple.
>>
>> _______________________________________________
>> Grok-dev mailing list
>> Grok-dev at zope.org
>> http://mail.zope.org/mailman/listinfo/grok-dev
>



More information about the Grok-dev mailing list