【问题标题】:Creating objects and their reference from text input without losing informations从文本输入创建对象及其引用而不丢失信息
【发布时间】:2015-08-05 22:22:03
【问题描述】:

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

假设我有一个如下列表:

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

如果你需要更多的代码,我会放上去

【问题讨论】:

  • 你这里似乎至少有两个问题。首先,您在想要package1 的地方打印出&lt;__main__.Node object at 0x100740ac8&gt;,可能是因为您缺少__str____repr__ 方法,或者在某处忘记了.name 归属。其次,您打印出None,您想要第二个package,大概是因为某些引用是错误的。您需要哪方面的帮助?
  • 第二个!我知道我正在打印&lt;__main__.Node object at 0x100740ac8&gt;,但这只是为了表明它们是对象,所以如果你能帮助我解决第二个问题,我将不胜感激!
  • 无论如何,不​​要只给我们一段代码,让我们猜测输入和上下文的其余部分,请给我们一个minimal, complete, verifiable example——我们可以运行它来看看是什么错误的。这可能只是意味着一个 6 行的精简 None 类和一个 text 列表的值以及关于 flag 的内容被剥离,因为它不相关,但很难猜测。
  • @abarnert 输入和以前一样,我只是把整个代码放好,这样如果我犯了错误更容易理解!感谢您的宝贵时间!
  • 整个代码仍然不是最小的、完整的、可验证的例子,因为它绝对不是最小的。

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


【解决方案1】:

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

您打印出None 的原因是:

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

第一个呼叫addEdge

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

我想你想要的是:

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

同时:

…我引用了 str 类型的对象,而我应该引用 Node 类型的对象,但我不知道如何修复它

如果你只是想在这里创建一个Node 对象,你可以按照前面几行的方法来做:

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

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

【讨论】:

    【解决方案2】:

    你使用 nexstr 不一致。

    看这部分:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2011-04-02
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多