Обход иерархии и модули сравнения для Python?

Остерегайтесь кейса, замените App \ Entity \ address на App \ Entity \ Address, обновите схему, и все должно быть в порядке

/**
 * @ORM\OneToOne(targetEntity="App\Entity\address", cascade={"persist", "remove"})
 * @ORM\JoinColumn(nullable=false)
 */
private $address;

должно быть

/**
 * @ORM\OneToOne(targetEntity="App\Entity\Address", cascade={"persist", "remove"})
 * @ORM\JoinColumn(nullable=false)
 */
private $address;
5
задан Soviut 21 March 2009 в 20:40
поделиться

3 ответа

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

class Node( object ):
    def __init__( self, myData, children=None )
        self.myData= myData
        self.children= children if children is not None else []
    def visit( self, aVisitor ):
        aVisitor.at( self )
        aVisitor.down()
        for c in self.children:
            aVisitor.at( c )
        aVisitor.up()

class Visitor( object ):
    def __init__( self ):
        self.depth= 0
    def down( self ):
        self.depth += 1
    def up( self ):
        self.depth -= 1

Я нахожу, что это - все, в чем я нуждаюсь. И я нашел, что трудно сделать допускающий повторное использование модуль из этого, потому что (a) существует так мало здесь и (b) каждое приложение добавляет или изменяет так много кода.

Далее, я нахожу, что обычно используемая иерархия является файловой системой, для которой я имею os модуль. Второе обычно использовало иерархию, сообщения XML, для которых у меня есть ElementTree (обычно через lxml). После тех двух я использую вышеупомянутые структуры в качестве шаблонов для моих классов, не в качестве литерального допускающего повторное использование модуля.

4
ответ дан 14 December 2019 в 09:01
поделиться

http://code.google.com/p/pytree/

они, возможно, излишество или не удовлетворенный вообще для того, в чем Вы нуждаетесь:

http://networkx.lanl.gov/

http://www.osl.iu.edu/~dgregor/bgl-python/

1
ответ дан 14 December 2019 в 09:01
поделиться

Я рекомендую рыть вокруг xmldifff http://www.logilab.org/859 и видеть, как они сравнивают узлы и обрабатывают параллельные деревья. Или, попытайтесь писать [рекурсивный] генератор, который приводит к каждому [значительному] узлу в дереве, сказать f(t), затем используйте itertools.izip(f(t1),f(t2)) собрать вместе пар узлов для сравнения.

Большинство иерархических структур, с которыми я имею дело, имеет больше чем одну "ось", как элементы и атрибуты в XML, и некоторые узлы являются более значительными, чем другие.

Для более причудливого решения сериализируйте эти два дерева к текстовым файлам, сделайте справочное примечание, что строка #n прибывает из узла #x в дереве. Сделайте это к обоим деревьям, подайте файлы в разность и просканируйте результаты для замечания, какие части дерева изменились. Можно отобразить ту строку #n из файла 1 (и поэтому узел #x в первом дереве) и строку #m из файла 2 (и поэтому узел #y второго дерева) означают, что некоторая часть каждого дерева является тем же или отличающийся.

Для любого решения Ваш оказываются перед необходимостью устанавливать "каноническую форму" Вашего дерева, то, которое могло бы отбросить весь игнорируемый пробел, атрибуты дисплея, дополнительные узлы, и т.д., от процесса сравнения. Это могло бы также означать делать в ширину по сравнению с глубиной первый обход дерева (деревьев).

2
ответ дан 14 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: