Seite 1 von 1

Verfasst: Freitag 11. August 2006, 20:10
von Masaru
murph hat geschrieben:

Code: Alles auswählen

class Server:
    def run(**args):
        def run_one_version(self):
            print "test"
            def timer(self):
                #do something else...
            while timer(self):
                print "while-schleife"
                return args['jklö'] == 'jklö':
        if args['asdf'] == 'asdf':
            run_one_version(self)
Mist, nie hänge ich an der richtigen Kiste mit Python ... aber kann die def run(**args): Klassenmethod ohne Klassenparameter self selbst funktionieren?

Wäre mir neu :D.

Was hingegen gar nicht mal so untypisch ist wäre dies hier hingegen:

Code: Alles auswählen

>>> class TestIt(object):
... 	def __init__(self):
... 		pass
... 	def run(self, exec_list=[]):
... 		def do_exec(exec_string):
... 			exec(exec_string)
... 		for this in exec_list:
... 			do_exec(this)
... 			
>>> tester = TestIt()
>>> tester.run(["print 'test'", "print 'it'"])
test
it
>>Masaru<<

Verfasst: Samstag 12. August 2006, 19:27
von keppla

Code: Alles auswählen

class Server:
    def run(**args):
        def run_one_version(self):
            print "test"
            def timer(self):
                #do something else...
            while timer(self):
                print "while-schleife"
                return args['jklö'] == 'jklö':
        if args['asdf'] == 'asdf':
            run_one_version(self)

was bitte ist daran übersichtlicher als die äquivalente version:

Code: Alles auswählen

class Server:
    def run(self, *args):
        if args['asdf'] == 'asdf':
            print "test"
            while True:
                # do something else...
                if condition: break
                return args['jklö'] == 'jklö':
Übersichtlichkeit ist nur bis zu einem gewissen Grad Geschmackssache. Man kann sie messen, lese mal in 3 wochen oder so dieses Post, und Messe die Zeit, die du brauchst, um die snippets zu lesen.
Mist, nie hänge ich an der richtigen Kiste mit Python ... aber kann die def run(**args): Klassenmethod ohne Klassenparameter self selbst funktionieren?
Doch, kann es, das self ist dann halt in args drin. Ich kann mir zwar kaum vorstellen, dass Murph das beabsichtigte, da er in Zeile 12 self benutzt, aber was tut man nicht alles für die Übersichtlichkeit ;)

Verfasst: Samstag 12. August 2006, 19:39
von murph
natürlich habe ich das self vergessen und im orginal ist es enthalten.
mein konstrukt macht aber uach nur sinn, wenn while weitaus mehr argumente bräuchte.
ich habe hier nur ein modell geliefert.
in wikrlichkeit soll für while überprüft werden, dass, falls eine zeit gesetzt wurde, bei ablauf der zeit der server ausgeschaltet wird.
falls zeit nicht gesetzt wurde, läuft einfach alles weiter.
falls andere variablen argumente gegeben werden (mir sind zurzeit keinen anderen eingefallen), sollen ebenfalls die überprüft werden.
natürlich könnte man das zur zeit noch alles dareinschreiben, aber ich bin ein freund von >80 zeilen, nur selten muss ich mehr nehmen...

Verfasst: Samstag 12. August 2006, 20:15
von keppla
mein konstrukt macht aber uach nur sinn, wenn while weitaus mehr argumente bräuchte.
ich habe hier nur ein modell geliefert.
selbst dann halte ich statt

Code: Alles auswählen

def condition(a,b,c):
   doSophisticatedStuffWith(a,b,c)
   doEvenMoreStuff(a,b)
   return theComplicatedResult(a,b,c)

while condition(a,b,c):
   print x
dieses hier

Code: Alles auswählen

while True:
   doSophisticatedStuffWith(a,b,c)
   doEvenMoreStuff(a,b)
   if not theComplicatedResult(a,b,c): break

   print x
für günstiger, da die scopes klarer sind und man "einfach runterlesen" kann, ohne irgendwelche funktionen auf den mentalen stack zu schubsen.
Alternativ könnte die innere funktion eine (private) methode des servers werden, schliesslich hat sie ja eine gewisse allgemeingültigkeit, wenn sie feststellen soll, ob zu gegebenen parametern der server laufen soll.
Wobei ich sagen muss: bei der Whileschleife kann ich noch halbwegs damit leben, wei run_one_version sehe ich nicht den geringsten grund,

um mal den Sprachnazi raushängen zu lassen:
Flat is better than nested
Simple is better than complex

Verfasst: Samstag 12. August 2006, 20:43
von murph
deiner meinung nach sollte ich lieber sagen, dass der nutzer sich run_one_version bzw run__other_version so merken soll?
kann ich mit anfreunden.