2017-09-24 81 views
-3

我的理解是.items()仅适用于python字典。python词典和项目()

但是,在下面的代码运行完美的代码中,似乎.items()函数对于字符串是有效的。 (这段代码是用于doc2vec的预处理阶段的)

我已经看了一会儿,我找不到为什么.items()似乎在这段代码中工作。

在代码中,'sources'只是一个实例的属性。但它可以调用.items()。

我在这里错过了什么?

class LabeledLineSentence(object): 

    def __init__(self, sources): 
     self.sources = sources 

     flipped = {} 

     # make sure that keys are unique 
     for key, value in sources.items(): 
      if value not in flipped: 
       flipped[value] = [key] 
      else: 
       raise Exception('Non-unique prefix encountered') 
+2

代码中没有任何东西显示暗示'sources'(因此'self.sources')不是类似dict'的对象。你为什么认为这是一个字符串? – kdopen

回答

0

给定的代码仅指定来源是实例的属性。它没有指定它的类型。实际上它可以是创建LabeledLineSentence实例时指定的任何类型。

i1 = LabeledLineSentence('sample text') # sources is now a string. Throws error! 
i2 = LabeledLineSentence({}) # source is a now a dictionary. No error! 

请注意,LabeledLineSentence实现需要sources参数为字典。

+0

谢谢你的答案Jayson :)我只是一个初学者,像你这样的答案为我节省了很多时间。在我看过的所有youtube python vids中,没有一个提到在创建时指定实例的类型。他们只是通过争论,就是这样。这些东西对于初学者来说非常耗时,因为我甚至都不知道这些东西。再次感谢,看起来我需要再次击中初学者的Python书。 :) :) –

+0

如果你正在寻找书籍,我建议初学者的“蟒蛇速成课程”。一旦基本原理明确,您可以查看诸如“有效的Python”或“流利的Python”等书籍, –

0

.items()适用于任何具有item方法的类。例如,我可以定义

class MyClass: 
    def items(self): 
     return [1,2,3,4] 

,然后运行

mc = MyClass() 
for i in mc.items(): print(i) 

想必你sources对象是具有这样的属性一类的。但是我们不知道是什么,因为它是LabeledLineSentence的构造函数的一个参数。

您能指教我们完整的源代码吗?然后,我们可能会看到正在传入的内容。

+0

感谢您的回答哈里:) –