0

MovieFilex.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を使用するにはどうすればよいですか。

4

2 に答える 2

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 に答える
1

何が何であるかを示していませんpop(そのコードを含めてください。それは重要なビットです)。ただし、問題は でmfSetあり、キーdictを割り当てていると思います。strおそらくmfSet[str(mf)] = mf. a の反復はdict、ディクショナリの値ではなく、キーを生成します。

setの代わりにを使用することもできますdict。または、に変更for mf in mfSet:for mf in mfSet.itervalues():ます (そして、mfSet型について誤解を招かないように変数名を変更します。PEP 8では、変数名にキャメルケースを使用しないことも推奨されています)。


したがって、 でグループ化しています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 に答える