我将一组MovieFile
个对象从x.py传递给y.py并迭代它们,试图在y.py中使用每个对象的属性
x.py
mfSet = {}
def pop():
## populate mfSet with MovieFile objects
m = MovieFile(title=t, year=y, dir=d, filename=f)
mfSet.setdefault(str(m), []).append(m)
class MovieFile():
def __init__(self, title, dir, filename, year=0):
self.title = title
self.year = year
self.fulltitle = title if year == 0 else title + ' (' + year + ')'
self.dir = dir
self.filename = filename
def __str__(self):
return repr(self.title + ' (' + self.year + ') at ' + self.dir)
y.py
from x import MovieFile, mfSet, pop # not sure if I need to import MovieFile
pop()
for mf in mfSet:
ft = mf.fulltitle # stacktrace says this attr doesn't exist for str object
title = mf.title # printing shows that this is "<built-in method title of str object at 0x10d84a3f0>"
所以我的主要问题是:
为什么MovieFile对象编译为str对象,一旦我使用这些对象,如何使用fulltitle
attr?
答案 0 :(得分:1)
您尚未显示pop
是什么(请包含该代码,这是重要的一点)。但是,我预计问题是mfSet
是dict
并且您正在分配str
个键 - 也许是mfSet[str(mf)] = mf
。 dict
的迭代产生键,而不是字典的值。
您可能希望使用set
而不是dict
。或者,将for mf in mfSet:
更改为for mf in mfSet.itervalues():
(并将变量名称mfSet
更改为不会误导类型; PEP 8也建议使用变量名中的camelCase。)
所以,你按MovieFile.__str__()
进行分组。那好吧。以下是我编写该代码的方法:
from collections import defaultdict
mf_collection = defaultdict(list)
def pop():
## populate the collection with MovieFile objects
m = MovieFile(title=t, year=y, dir=d, filename=f)
mf_collection[str(m)].append(m)
class MovieFile():
def __init__(self, title, dir, filename, year=0):
self.title = title
self.year = year
self.fulltitle = title if year == 0 else title + ' (' + year + ')'
self.dir = dir
self.filename = filename
def __str__(self):
return repr(self.title + ' (' + self.year + ') at ' + self.dir)
和y.py:
from x import mf_collection, pop
pop()
for mf_group in mf_collection.itervalues(): # this yields lists of MovieFiles
for mf in mf_group: # this yields the actual MovieFiles
ft = mf.fulltitle
title = mf.title
因为您正在使用列表作为值,所以您需要进行另一级迭代。
答案 1 :(得分:1)
{}
创建一个字典,而不是一个集合(这是因为dict
和set
文字都使用{}
表示法,但字典文字首先出现。)
如果您想要一个空集,则需要使用set()
。然后pop
变为
mfSet = set()
def pop():
mfSet.add(MovieFile(title=t, year=y, dir=d, filename=f))