Hallo Allerseits,
mein python Skript läuft einbahnfrei. Solang ich ein statische Code Analyse durchführe, spuckt mir der Analysator (PyLint) eine Warning aus:
Ich verwende viele if Anweisungen hintereinander in einer Funktion.
Wie kann man das verhindern dass ich weniger if Anweisungen schreibe?
Es gibt ja kein swith und case wie in C oder C++!!!!!!!!!!!!
Kann jemand mir ein Tipp geben??
Vielen Dank
Karomi
Mehrere aufeinander folgende if anweisung in python kürzen
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Mit der Benutzung eines Hastables, d.h. eines Dicts, an das Funktionen gebunden werden.karomi hat geschrieben:Wie kann man das verhindern dass ich weniger if Anweisungen schreibe?
Brauchts auch nicht (und ein Ausrufezeichen reicht, bei dir klingt es so, als wäre es sehr schlimm, dass es kein Switch/Case gibt).karomi hat geschrieben:Es gibt ja kein swith und case wie in C oder C++!!!!!!!!!!!!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Karomi!karomi hat geschrieben:Ich verwende viele if Anweisungen hintereinander in einer Funktion.
Solange dein Code funktioniert, gut lesbar ist und du nicht zehn oder zwanzig unnötige If-Anweisungen untereinander stehen hast, würde ich mir keine Sorgen machen.
Gerade in die "zuviele IF"-Geschichte wird manchmal zu viel Energie gesteckt. Oft ist es die Aufregung nicht wert. Und andere Lösungen sind auch nicht gerade einfacher und übersichtlicher.
mfg
Gerold

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Ich denke man sollte diese Warnung von PyLint ernst nehmen wenn es sich um verschachtelte ``if``-Anweisungen handelt, denn dann hat man es mit erhöhter und wahrscheinlich zu hoher Komplexität in einer Funktion zu tun.
Wenn die ``if``/``elif``-Anweisungen linear als switch/case Ersatz benutzt werden, dann kann man dem Quelltext in der Regel einfach folgen.
Man kann natürlich trotzdem kurz überlegen ob ein Dictionary oder eine Schleife benutzt werden kann.
Wenn die ``if``/``elif``-Anweisungen linear als switch/case Ersatz benutzt werden, dann kann man dem Quelltext in der Regel einfach folgen.
Man kann natürlich trotzdem kurz überlegen ob ein Dictionary oder eine Schleife benutzt werden kann.
Hallo,
ijr habt geschrieben:
Mit der Benutzung eines Hastables, d.h. eines Dicts, an das Funktionen gebunden werden.
Was ist ein Hastables?
Kann jemand ein Beispiel hier schreiben???
Noch was?
ich konnte mir nicht vorstellen wie ich IF Anweisungen durch ein Dictionary ersetzen kann, kann jemand ein Beispiel geben???
Vielen Dank
Karomi
ijr habt geschrieben:
Mit der Benutzung eines Hastables, d.h. eines Dicts, an das Funktionen gebunden werden.
Was ist ein Hastables?
Kann jemand ein Beispiel hier schreiben???
Noch was?
ich konnte mir nicht vorstellen wie ich IF Anweisungen durch ein Dictionary ersetzen kann, kann jemand ein Beispiel geben???
Vielen Dank
Karomi
ich verstehe nicht was du meinstLeonidas hat geschrieben:Mit der Benutzung eines Hastables, d.h. eines Dicts, an das Funktionen gebunden werden.karomi hat geschrieben:Wie kann man das verhindern dass ich weniger if Anweisungen schreibe?
[...]

lg
Hoi,
etwas Pseudocode zur Erklärung wie ein dict (hashtable in anderen Sprachen) switch oder case Statements ersetzen kann:
Gruß,
Christian
etwas Pseudocode zur Erklärung wie ein dict (hashtable in anderen Sprachen) switch oder case Statements ersetzen kann:
Code: Alles auswählen
def f1(): pass
def f2(): pass
def f3(): pass
function_dict = {
'parameter1' : f1,
'parameter2' : f2,
'parameter3' : f3}
#entweder:
function_to_call = function_dict[paramter]
function_to_call()
#oder in einer Zeile:
function_dict[paramter]()
Christian
Hmm, allso stat so...
...schreibe ich das so?
Hmm, das funtzt aber nur mit Funktionen/Methoden und nciht für mehrere Zeilen code in nem if-block.
Oder anders: Sol das ein Wink mit den Zaunpfahl sein, das man Anweisungen die man in if-blöcke packt (wo man sehr viel if-blöcke hat ca. um die 20), lieber in Funktionen aufteilen sollte, die dann über ein hashtable aufgerufen werden um sich die ifs zu sparren?
lg
Code: Alles auswählen
[...]
para = "parameter1"
if para == "parameter1":
f1()
elif para == "parameter2":
f2()
elif para == "parameter3":
f3()
[...]
Code: Alles auswählen
[...]
para = "parameter1"
function_dict[para]()
Oder anders: Sol das ein Wink mit den Zaunpfahl sein, das man Anweisungen die man in if-blöcke packt (wo man sehr viel if-blöcke hat ca. um die 20), lieber in Funktionen aufteilen sollte, die dann über ein hashtable aufgerufen werden um sich die ifs zu sparren?
lg
vielleicht hilft das hier:
die funktionen werden einfach in einer liste gespeichert.
r2d2
Code: Alles auswählen
def f0(): print "0"
def f1(): print "1"
def f2(): print "2"
fx = [f0,f1,f2]
dann:
for i in range(0,3):
fx[i]()
'''statt:
if i == 0: f0()
if i == 1: f1()
if i == 2: f2()'''
r2d2
äh, nimm diese schlange von meinem hals.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi XtraNine!XtraNine hat geschrieben:Sol das ein Wink mit den Zaunpfahl sein, das man Anweisungen die man in if-blöcke packt (wo man sehr viel if-blöcke hat ca. um die 20), lieber in Funktionen aufteilen sollte, die dann über ein hashtable aufgerufen werden um sich die ifs zu sparren?
Sicher nicht! Das würde die Sache nur verkomplizieren.
Du kannst auch einfache Werte zurück geben lassen. Z.B. so:
Code: Alles auswählen
def is_ok(parameter):
d = {
"TRUE": "ok",
"OK": "ok",
"FALSE": "nicht ok"
}
return d[parameter]
print is_ok("TRUE")
mfg
Gerold

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Im Fall von 20 ``if``-Blöcken, die mehrere Zeilen Quelltext enthalten, würde sagen ja. Wenn diese Blöcke komplett unterschiedlichen Code enthalten, macht die Funktion zu viele verschiedene Dinge auf einmal und wenn nahezu das gleiche mit leichten Variationen gemacht wird, dann braucht man nicht für jeden Block eine andere Funktion, sondern kann die Gemeinsamkeiten in einer oder zwei parametrisierten Funktionen herausziehen.XtraNine hat geschrieben:Oder anders: Sol das ein Wink mit den Zaunpfahl sein, das man Anweisungen die man in if-blöcke packt (wo man sehr viel if-blöcke hat ca. um die 20), lieber in Funktionen aufteilen sollte, die dann über ein hashtable aufgerufen werden um sich die ifs zu sparren?
Aber das kommt wie gesagt auch immer auf den konkreten Fall und ein wenig auf den eigenen Geschmack an, wie man das am "besten" löst.
Na, das allerdings ist Code schön nach der Reihe ausführen - nur etwas verkompliziert.r2d2 hat geschrieben:vielleicht hilft das hier:
...
die funktionen werden einfach in einer liste gespeichert.
Im Übrigen habe ich nichts zu meinen Vorschreibern hinzuzufügen - manches ist Geschmackssache. Ich wollte nur die Eingabe von 'Leonidas' erläutern.
Gruß,
Christian
Hi,
habt ihr ne Idee ob ich das noch verkürzen / verbessern kann? Weil ich brauche noch weitere Bedingungen und rücke immer weiter nach rechts was dann schlechter zu lesen ist...?
if bought:
if (abstand_aktuell_zu_slow > sell_level_slow):
if (abstand_aktuell_zu_fast > sell_level_fast):
if (symbol0_price > last_ema_xxl):
if (profit_since_buy_sy0 > -(buy_level_slow-sell_level_slow)):
#dann mach das.....
Danke für weitere Tipps
LG M
habt ihr ne Idee ob ich das noch verkürzen / verbessern kann? Weil ich brauche noch weitere Bedingungen und rücke immer weiter nach rechts was dann schlechter zu lesen ist...?
if bought:
if (abstand_aktuell_zu_slow > sell_level_slow):
if (abstand_aktuell_zu_fast > sell_level_fast):
if (symbol0_price > last_ema_xxl):
if (profit_since_buy_sy0 > -(buy_level_slow-sell_level_slow)):
#dann mach das.....
Danke für weitere Tipps
LG M
Code: Alles auswählen
if dies and das and folgendes:
@sozo
Weiterhin könnte man viele Prüfungen über mehrere Funktionen oder Methoden aufbauen. Also nicht alles "stumpf" runterschreiben, sondern sich ein bisschen mehr Struktur beim Programmaufbau überlegen. Einzelne Prüfungen lassen sich meist sinnvoll gruppieren und als Eigenschaften ausdrücken. Ich habe keine Ahnung, was dein Code genau machen soll, aber als erstes fällt mir bei dem Beispiel etwas wie should_sell_fast() / should_sell_slow() ein. Somit kann man die dahinter stehende Mathematik schrittweise hinter einer eigenen Schnittstelle kapseln. Das gibt dann zwar mehr Zeilen Code, ist aber in aller Regel lesbarer.
EDIT: Und es wäre beim nächsten Mal schön, wenn du einen eigenen Thread erstellst und keine 16 Jahre alten Beiträge hochholst. Das wird hier, wie in den meisten anderen Foren auch, nicht so gern gesehen...
Weiterhin könnte man viele Prüfungen über mehrere Funktionen oder Methoden aufbauen. Also nicht alles "stumpf" runterschreiben, sondern sich ein bisschen mehr Struktur beim Programmaufbau überlegen. Einzelne Prüfungen lassen sich meist sinnvoll gruppieren und als Eigenschaften ausdrücken. Ich habe keine Ahnung, was dein Code genau machen soll, aber als erstes fällt mir bei dem Beispiel etwas wie should_sell_fast() / should_sell_slow() ein. Somit kann man die dahinter stehende Mathematik schrittweise hinter einer eigenen Schnittstelle kapseln. Das gibt dann zwar mehr Zeilen Code, ist aber in aller Regel lesbarer.
EDIT: Und es wäre beim nächsten Mal schön, wenn du einen eigenen Thread erstellst und keine 16 Jahre alten Beiträge hochholst. Das wird hier, wie in den meisten anderen Foren auch, nicht so gern gesehen...
Danke. So hatte ich es zuerst...ewig langer Satz und der ist nicht Handy tauglich. Wie bekomme ich es aber in mehrere Zeilen? Denn der Syntax ist falsch__deets__ hat geschrieben: ↑Montag 14. November 2022, 21:23Code: Alles auswählen
if dies and das and folgendes:
Code: Alles auswählen
if dies
and das
and jenes
and folgendes:
Handy tauglich ist ein schwieriges Kriterium für Code. Aber das aufteilen auf mehrere Zeilen geht mit \ am Ende der Zeile.
Code: Alles auswählen
if dies \
and das:
…
wow, ich Danke Dir! Vier tabs eingespart und nun ist alles wieder links und nicht so weit rechts. Leider verträgt es aber keine Kommentare nach dem "\" nur nach dem ":"
Code: Alles auswählen
if not bought \
and abstand_aktuell_zu_slow < buy_level_slow \
and abstand_aktuell_zu_fast < buy_level_fast \
and symbol0_price < last_ema_slow \
and profit_since_buy_sy0 < -buy_level_slow-sell_level_slow: #Kommentar erlaubt
…