将以下PhotoImage代码行减少到尽可能少的行

时间:2011-04-22 22:13:35

标签: python metaprogramming

目标是将以下代码减少到尽可能少的代码行(和少数字符)。它不需要是“可读的”甚至是“pythonic”,只是简短而甜蜜。这些更有趣。

self.BlueEgg = PhotoImage(file="assets/blueegg.gif")
self.PolkaEgg = PhotoImage(file="assets/polkaegg.gif")
self.RedEgg = PhotoImage(file="assets/redegg.gif")
self.StripeEgg = PhotoImage(file="assets/sripeegg.gif")
self.YellowEgg = PhotoImage(file="assets/yellowegg.gif")
self.PurpleEgg = PhotoImage(file="assets/purpleegg.gif")
self.PinkEgg = PhotoImage(file="assets/pinkegg.gif")
self.OrangeEgg = PhotoImage(file="assets/orangeegg.gif")
self.CrazyEgg = PhotoImage(file="assets/crazyegg.gif")
self.PlainEgg = PhotoImage(file="assets/plainegg.gif")

它确实适用于我的程序,但我更多 - 所以只是想看看你们可以想出什么!祝大家复活节快乐!

2 个答案:

答案 0 :(得分:3)

唯一改变的是egg的类型,它改变了self和文件名的属性。所以......

types = ('Blue', 'Polka', 'Red', 'Stripe', 'Yellow', 'Purple', 'Pink', 'Orange', 'Crazy', 'Plain')
for t in types:
    setattr(self, '%sEgg' % t, PhotoImage(file='assets/%segg.gif' % t.lower()))

答案 1 :(得分:2)

在列表中的元组中存储属性和文件名:

mylistoftuples = [('BlueEgg', "assets/blueegg.gif"), .......]

然后,循环分配:

for attr, filename in mylistoftuples:
   setattr(self, attr, PhotoImage(file=filename))

请注意,您还有两种按摩代码的可能性:
1)目录总是相同的,所以你不需要为列表中的每个项目硬编码assets / xxxx.gif。你可以在for循环中构建它。
2)文件名等于小写的属性。因此,如果只在列表中存储属性(p.e.BluEgg)而不是元组,则可以从中导出文件路径:

mylist = ['BlueEgg', .......]
for attr in mylist:
     filename = os.path.join('assets', '%s.gif' % attr.lower()) 
     setattr(self, attr, PhotoImage(file=filename))