在不丢失信息的情况下从文本输入创建对象及其引用

Creating objects and their reference from text input without losing informations

基本上我想做的是实现一个依赖解析算法。

假设我有如下列表:

package1:
package2: package1
package3: package1, package2
package4: package1 
package5: package1, package2 

基本上,package1只依赖于自身,package2依赖于package1package3依赖于1和2等等。

到目前为止我所做的是:

假设我运行上面列表的程序,输出是这样的:

<__main__.Node object at 0x100740ac8>
<__main__.Node object at 0x100740b00>
None
<__main__.Node object at 0x100740ac8>
None
None
<__main__.Node object at 0x100740b00>
None
<__main__.Node object at 0x100740ac8>
None
None

我创建新包对象的部分工作正常,因为我们可以看到有对象,但是我引用主包的依赖项的部分失败了,因为它显示 None,这是不正确。

为了正确,输出应该如下所示

package1
package2
package1
package3
package1
package2
package4
package1
package5
package1
package2

我认为我犯的错误是这部分:

f = open('data.txt','r')


text = []
resolved = []
unresolved = []

for line in f.readlines():
    for char in line.split():
        text.append(char)



class Node:

    def __init__(self, name):
        self.name = name
        self.edges = []

    def addEdge(self, node):
        self.edges.append(node)

    def dep_resolve(self, resolved, unresolved):
        unresolved.append(self)
        print (self.name)
        for edge in self.edges:
            if edge not in resolved:
                if edge in unresolved:
                    raise Exception('Circular')
                edge.dep_resolve(resolved, unresolved)
        resolved.append(self)
        unresolved.remove(self)

global flag
for i in range(len(text)):
    if text[i].endswith(':'):
        newstr = text[i].replace(':', '')
        newstr = Node(newstr)
        flag = newstr
        print(flag.name)

    else:
        flag.addEdge(text[i])
        print(flag.addEdge(text[i]))

尤其是 else,我引用了一个类型为 str 的对象,而我应该引用了一个类型为 Node 的对象,但我不知道如何修复它.

如果您需要更多代码,我会提供

我不明白你的代码应该如何工作,因为有很多部分没有意义。但是,我可以解释这么多:

你打印出 None 的原因是:

flag.addEdge(text[i])
print(flag.addEdge(text[i]))

第一次调用addEdge.

第二个再次调用 addEdge,这似乎是错误的,print 是它的 return 值。因为它没有 return 语句,所以该值为 None.

我想你想要的是:

flag.addEdge(text[i])
print(text[i])

同时:

… i reference to an object of type str while i should reference to an object of type Node but i have no idea how to fix it

如果您只想在此处创建一个 Node 对象,您可以按照与之前几行相同的方式进行操作:

new_node = Node(text[i])
flag.addEdge(new_node)
print(new_node)

我不确定这会给你带来什么,但它会解决你描述的问题。

您使用 nexstr 不一致。

看这部分:

newstr = text[i].replace(':', '')
newstr = Node(newstr)
flag = newstr
print(flag.name)

使用 newstr = text[i].replace(':', '') 你实际上分配了 newstr = ''。 然后用空字符串 '' 作为参数实例化 Node 并再次将其赋值给 newstr,所以 newstr 指的是一个对象(节点 class),不再是字符串. 比您将此对象重新分配给 flag

首先,确保 newstr 确实包含您想要的内容。 那么

flag = Node(newstr)
print(flag.name)

应该可以(不过我还没有测试过)