Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将一个节点连接到将来要创建的另一个节点_Python_Data Structures - Fatal编程技术网

Python 将一个节点连接到将来要创建的另一个节点

Python 将一个节点连接到将来要创建的另一个节点,python,data-structures,Python,Data Structures,我正在用Python为节点和连接的文本文件编写解析器。 例如,文本文件如下所示: a b b <-> a # exists a connection between a/b c d d <-> e # PROBLEM! this node connect to another node not yet being created e 解决这一问题的直观方法是延迟连接阶段,但这表明解析必须分为两部分,节点对象必须处理原始文本 #blah blah

我正在用Python为节点和连接的文本文件编写解析器。
例如,文本文件如下所示:

a
b
   b <-> a   # exists a connection between a/b
c
d
   d <-> e   # PROBLEM! this node connect to another node not yet being created
e
解决这一问题的直观方法是延迟连接阶段,但这表明解析必须分为两部分,节点对象必须处理原始文本

#blah blah    
for line in raw:
    if is_node(line):
        add_node(NodeBuilder(line))
    elif is_connection(line):
        nameEndA, nameEndB = parse_connection(line)
        endA = nodeDict[nameEndA]
        try:
            endB = nodeDict[nameEndB]
            endA.connect(endB)
        except KeyError:
            endA.txt2Parse(line)

for node in nodes:
    if node.txt2Parse:
        node.parse_and_connect()     # has to parse raw data in Node object!!!

有没有更好的方法来设计它而不使用糟糕的封装?

假设
parse\u connection(line)
返回节点的字符串名称, 你可以用

    for name in (nameEndA, nameEndB):
        if not name in nodeDict:
            add_node(NodeBuilder(name))
在建立连接之前添加节点


在从
nodeDict
访问节点名称之前添加检查:

for line in raw:
    if is_node(line):
        add_node(NodeBuilder(line))
    elif is_connection(line):
        nameEndA, nameEndB = parse_connection(line)
        for name in (nameEndA, nameEndB):
            if not name in nodeDict:
                add_node(NodeBuilder(name))
        endA = nodeDict[nameEndA]
        endB = nodeDict[nameEndB]    
        endA.connect(endB)
如果这是您认为可以改进的工作代码,请参阅。如果没有,请给出一个清晰的示例,说明问题所在。
for line in raw:
    if is_node(line):
        add_node(NodeBuilder(line))
    elif is_connection(line):
        nameEndA, nameEndB = parse_connection(line)
        for name in (nameEndA, nameEndB):
            if not name in nodeDict:
                add_node(NodeBuilder(name))
        endA = nodeDict[nameEndA]
        endB = nodeDict[nameEndB]    
        endA.connect(endB)