[TasPython] Διαλέξτε το στυλ σας

Dimitris Leventeas mydimle at gmail.com
Wed Sep 1 23:24:23 CEST 2010


Πολύ ωραίο και εκπαιδευτικό ποστ!

On Wednesday 01 September 2010 17:53:33 Dimitris Glezos wrote:
> ### 1 -- "The One-liner Showoff" [edited]
> 
> def cycle(self):
>     self.level = (self.level + 1) % len(LEVEL_VALUES)

Το πιο γρήγορο και πιο απλό, υπό την προϋπόθεση ότι οι τιμές του level είναι 
ακέραιες και συνεχόμενες.

> ### 2 -- "The Readability Nazi"
> 
> def cycle(self):
>     if self.level == max(LEVEL_VALUES.keys()):
>         self.level = 0
>     else:
>         self.level++

Καλό λόγω της απλότητας του. Δεν χρειάζεται κάποιος να το σκεφθεί καθόλου με 
την πράξη modulo και δύσκολο να κρύβει κάποιο bug.  Το if else ίσως είναι λίγο 
πιο αργό από την πράξη modulo.

> ### 3 "The Re-usability Nerd"
> 
> def increase(self):
>     if self.level + 1 == max(LEVEL_VALUES.keys()):
>         raise OverflowError('No higher priority')
>     self.level++
> 
> def cycle_up(self):
>     try:
>         self.increase()
>     except OverflowError:
>         self.level = 0

Ίσως αν έχεις πάρα πολλά levels καλύτερη λύση από άποψη performance*. Μέχρι 
τότε, εγώ δεν θα το σκεφτόμουν. Στα θετικά, η ξεχωριστή συνάρτηση increase.

* Το try ... except είναι πιο γρήγορο αν σχεδόν πάντα γίνεται ότι υπάρχει μέσα 
στο try και σπάνια μπαίνουμε στο except. Αλλιώς καλύτερο το if, else.

> ### 4 "The Iterator Abuser"
> 
> class MyModel():
>     c = itertools.cycle(LEVEL_VALUES.keys())
>     level = model.Field(mpla, mpla, default=self.c.next())
>     def cycle(self):
>         while self.level != self.c.next() # search for current key
>             pass
>         self.level = self.c.next()

Όχι τόσο κομψό. Είναι δύσκολο να καταλάβεις τη λογική του. Εμένα με μπέρδεψε.

> ### 5 -- "The lamda freak"
> 
> cycle = lambda pos: (lambda x: 0, lambda x: x+1)[pos>max-1](pos)

Lol (με πολλά λάμδα).

Δ.
-- 
-Είμαι αυτοδημιούργητος!
-Είπα κι εγώ, μπορεί ο θεός να έκανε τέτοιο λάθος;!


More information about the TasPython mailing list