Mark
Mark

Reputation: 323

I have a python tuple of namedtuples. Is there a way to access individual members other than by indexing or unpacking them?

I have a python 3.5 tuple where a typical structure of a data item is something like this.

item = (PosixPath('/mnt/dson/Music/iTunes/iTunes Music/funtoons.mp3'), tagtypes(txt=False, word=False, ebook=False, image=False, exe=False, iso=False, zip=False, raw=False, audio=True, music=True, photoshop=False, video=False, src=False, geek=False, pdf=False, appledouble=False, dot=False), fileinfo(size=13229145, datetime=1333848240.0))

This describes a common file on my Linux filesystem. If I want to know the size of the given file, I can access it with something like this --- item[2].size. Similarly, logic to grab the tags describing the file's contents would use code like --- item[1].music, etc..

It seems on the face of it, with each object being unique in the tuple that if you wanted to access one of the members, you should be able to drill down in the tuple and do something like item.fileinfo.size. All of the information to select the correct item from the tuple is deducible to the interpreter. However, if you do attempt something like item.fileinfo.size you will get (almost expectedly) an attribute error.

I could create a namedtuple of namedtuples but that has a bit of a code smell to it.

I'm wondering if there is a more pythonic way to access the members of the tuple other than by indexing or unpacking. Is there some kind of shorthand notation such that you convey to the interpreter which one of the tuple's elements you must be referencing (because none of the other options will fit the pattern)?

This is kind of a hard thing to explain and I'm famous for leaving out critical parts. So if more info is needed by the first responders, please let me know and I'll try and describe the idea more fully.

Upvotes: 1

Views: 105

Answers (1)

Dmitry Rubanovich
Dmitry Rubanovich

Reputation: 2627

You really think doing this:

Item = namedtuple('Item', 'PosixPath tagtypes fileinfo')

item = Item(PosixPath('/mnt/dson/Music/iTunes/iTunes Music/funtoons.mp3'), tagtypes(txt=False, word=False, ebook=False, image=False, exe=False, iso=False, zip=False, raw=False, audio=True, music=True, photoshop=False, video=False, src=False, geek=False, pdf=False, appledouble=False, dot=False), fileinfo(size=13229145, datetime=1333848240.0))

is not worth it if it lets you do item.fileinfo.size AND item[2].size ? That's pretty clean. It avoids creating classes by hand and gives you all the functionality in a clear and concise manner. Seems like pretty good python to me.

Upvotes: 1

Related Questions