在不丢失信息的情况下从文本输入创建对象及其引用
Creating objects and their reference from text input without losing informations
基本上我想做的是实现一个依赖解析算法。
假设我有如下列表:
package1:
package2: package1
package3: package1, package2
package4: package1
package5: package1, package2
基本上,package1
只依赖于自身,package2
依赖于package1
,package3
依赖于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)
应该可以(不过我还没有测试过)
基本上我想做的是实现一个依赖解析算法。
假设我有如下列表:
package1:
package2: package1
package3: package1, package2
package4: package1
package5: package1, package2
基本上,package1
只依赖于自身,package2
依赖于package1
,package3
依赖于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)
应该可以(不过我还没有测试过)