0

我将一组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>"

所以我的主要问题是:

fulltitle为什么 MovieFile 对象被编译为 str 对象,一旦我使用了这些对象,我该如何使用attr?

4

2 回答 2

1

您还没有展示什么pop是(请包括该代码,这是重要的一点)。但是,我预计问题出mfSet在 adict并且您正在分配str键 - 也许mfSet[str(mf)] = mf. a 的迭代dict产生键,而不是字典的值。

您可能想要使用 aset而不是 a 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

因为您正在使用列表作为值,所以您需要进行另一个级别的迭代。

于 2012-09-12T00:10:39.887 回答
1

{}制作字典,而不是集合(这是因为dictset文字都使用{}符号,但字典文字排在第一位)。

如果你想要一个空集,你需要使用set(). 然后pop变成

mfSet = set()
def pop():
    mfSet.add(MovieFile(title=t, year=y, dir=d, filename=f))
于 2012-09-12T00:59:20.733 回答