Jython получает TypeError: супертипы, которые имеют измененный атрибут, имеют конфликт MRO

Я работаю над модульным тестовым приложением IBM FileNet P8 Platform 5.2.1 Content Engine в jython 2.7.

# Verify a directory
def testDirectory(self):
    directoryConfigurationList = [] 
    url = self.serverUrl + "?tenantId=" + self.tenantName  
    connection = Factory.Connection.getConnection(url)
    domain = Factory.Domain.fetchInstance(connection, self.tenantName, None)
    if (domain is not None):
        dc_set = domain._DirectoryConfigurations.iterator()
        while dc_set.hasNext():
            dc = dc_set.next()
            print dc._DisplayName

Я получаю сообщение об ошибке:

TypeError: Супертипы, которые имеют измененный атрибут, имеют конфликт MRO [атрибут = удалить, супертипы = [, 'com.filenet.api.collection.DependentObjectList'>], тип = CmIndexPartitionConstraintList]

в строке dc_set = domain._DirectoryConfigurations.iterator(), и я не совсем понимаю, почему. Любая помощь в этом будет оценена по достоинству. Следующие ссылки на центр знаний IBM 5.2.1 могут оказаться полезными:


person Neo84    schedule 09.06.2016    source источник
comment
Насколько я понимаю, похоже, что Jython пытается реализовать свою версию списков, в то время как это уже тип списка, определенный в DependentObjectList, от которого наследуется DirectoryConfigurations. Я думаю...   -  person Neo84    schedule 11.06.2016


Ответы (1)


Проблема не в вашем коде fileNet, похоже, Jython не ожидает когда-либо увидеть карту, которая также является итерируемой. Я предполагаю, что у него есть логика, которая устанавливает iter на каждый, а затем возникает конфликт. К сожалению, нет ничего неправильного в типе, который реализует и Map, и Iterable. Jython следует уступить Iterable для iter, но похоже, что для этого ему потребуется улучшение.

Если вы проверите спецификацию интерфейса DependentObjectList, вы увидите в интерфейсах супертипа, что его интерфейсы супертипа java.util.Collection, EngineCollection, java.lang.Iterable, java.util.List, java.io.Serializable.

Я считаю, что это было потенциально исправлено, начиная с Jython 2.7b1.

Обновление:
Я копался в коде, который мы разработали ранее на Java, мы использовали следующую логику для преобразования коллекции движка в коллекцию на основе списка.

public static <T> List<T> convertToList(EngineCollection engineCollection) {
    Iterator<T> engineCollectionIterator = engineCollection.iterator();
    List<T> collection = new ArrayList<T>();
    CollectionUtils.addAll(collection , engineCollectionIterator);
    return collection ;
}
person WiredCoder    schedule 15.07.2016
comment
Что поражает меня, так это то, что я также вижу это для List/Collection. TypeError: супертипы, которые имеют измененный атрибут, имеют конфликт MRO[attribute=__contains__, supertypes=[‹type 'java.util.Collection'›, ‹type 'java.util.Set'›], type=...] Мы Хотя вы на 2.7.2b2, поэтому я не думаю, что это было исправлено. - person Trejkaz; 03.02.2020