从文本输入创建对象及其引用而不会丢失信息

时间:2015-05-24 08:09:41

标签: python algorithm oop python-3.x dependencies

基本上我要做的是实现依赖性解析算法。

假设我有一个如下列表:

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的对象,但我不知道如何修复它。 / p>

如果您需要更多代码,我会把它放在

2 个答案:

答案 0 :(得分:1)

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

您打印None的原因是:

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

第一次拨打addEdge

第二次再次调用addEdge,这似乎是错误的,print是它的返回值。由于它没有return语句,因此该值为None

我认为你想要的是:

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

同时

  

...我引用了str类型的对象,而我应该引用类型Node的对象,但我不知道如何解决它

如果你只想在这里创建一个Node对象,你可以像之前几行一样做到这一点:

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

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

答案 1 :(得分:0)

您使用Intent intent = Games.TurnBasedMultiplayer.getInboxIntent(getApiClient()); startActivityForResult(intent, RC_LOOK_AT_MATCHES); 不一致。

看看这部分:

nexstr

使用newstr = text[i].replace(':', '') newstr = Node(newstr) flag = newstr print(flag.name) 您实际指定newstr = text[i].replace(':', '')。 然后使用空字符串newstr = ''实例化Node作为参数,并再次将其分配给'',因此newstr引用一个对象(Node类),而不是字符串。 比将此对象重新分配给newstr

首先,确保flag确实包含您想要的内容。 然后

newstr

应该工作(我还没有测试过它)