Forum: PC-Programmierung Syntaktische Python-Spaesse


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Martin S. (strubi)


Lesenswert?

Moin,

beim Herumspielen mit Generatoren und zwecks Verbesserung der Lesbarkeit 
(das mag zunaechst als Witz erscheinen) bin ich bei folgendem 
Python-Code gelandet:
1
  @process
2
  def worker(context):
3
    yield (switch(context)
4
      @case@ (a == 1) @select@ [
5
        b @next@ 2,
6
        v @next@ True
7
      ]
8
      @case@ (a == 2) @select@ [
9
        b @next@ 1, v @next@ False
10
      ]
11
      @fallback@ [
12
        b @next@ 4, v @next@ False
13
      ]
14
    )

Spaetestens jetzt sollte angemerkt werden, dass es sich um 
Transpilat-Material handelt, d.h. es wird hier Code generiert anstatt 
unmittelbar ausgefuehrt (und die Maschinerie dahinter noch 
verschwiegen).
Aber es ist immerhin legaler Python-Code, im Sinne einer DSL und moege 
zur Anregung oder weiteren Ideen dienen. Zunaechst lasse ich es mal zur 
Verwirrung so stehen, und wage nur die Frage: Erkennt wer, was hier 
passiert?

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Martin S. schrieb:

> Aber es ist immerhin legaler Python-Code

Wenn das so ist (kann ich nicht einschätzen), beweist das eigentlich 
nur, dass Python auch nicht besser ist, als jede andere verbreitete 
Sprache. Man kann halt in jeder Sprache praktisch vollkommen unlesbaren 
Code verfassen.

Aber: man muss das nicht tun. In keiner dieser Sprachen. Naja, C++ 
vielleicht mal ein wenig ausgenommen...

von Ein T. (ein_typ)


Lesenswert?

Martin S. schrieb:
> Aber es ist immerhin legaler Python-Code,

Nein.

von Ein T. (ein_typ)


Lesenswert?

Ob S. schrieb:
> Man kann halt in jeder Sprache praktisch vollkommen unlesbaren
> Code verfassen.

Das stimmt.

> Aber: man muss das nicht tun. In keiner dieser Sprachen. Naja, C++
> vielleicht mal ein wenig ausgenommen...

Der Unterschied ist: in Python muß man sich Mühe geben, wenn man 
unlesbaren Code schreiben will. In den meisten anderen Sprachen muß man 
sich Mühe geben, um lesbaren Code zu schreiben.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Ein T. schrieb:

> Martin S. schrieb:
>> Aber es ist immerhin legaler Python-Code,
>
> Nein.

Wenn das so ist, sollte er nicht lauffähig sein. Also entweder einen 
Laufzeitfehler liefern (im Interpreterbetrieb) oder einen 
Compilezeit-Fehler (wenn halt compiliert wird).

Einwände?

von Steve van de Grens (roehrmond)


Angehängte Dateien:

Lesenswert?

Martin S. schrieb:
> Erkennt wer, was hier passiert?

Erkennt jemand, um welche Mahlzeit es sich hier handelt?

Nee sorry, damit will ich mich nicht beschäftigen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ein T. schrieb:
> Martin S. schrieb:
>> Aber es ist immerhin legaler Python-Code,
>
> Nein.

Der Code ist legal, wenn vorher folgenden Dinge geeignet definiert
worden sind:

- der Dekorator process

- die Funktion oder Klasse switch

- die Variablen case, select, next, fallback, b und v

- der /__matmul__/-Operator für die Klassen, auf deren Instanzen er
  angewendet wird

von Martin S. (strubi)


Lesenswert?

Ob S. schrieb:
> Wenn das so ist, sollte er nicht lauffähig sein. Also entweder einen
> Laufzeitfehler liefern (im Interpreterbetrieb) oder einen
> Compilezeit-Fehler (wenn halt compiliert wird).

Er ist lauffaehig (sofern die Hilfsklassen importiert sind), und er 
generiert auch das Richtige.
Ich betone noch mal den Hinweis: Es soll Code generiert werden, nicht 
nativ ausgefuehrt. Es handelt sich auch nicht um Code-Obfuscation.
Ich hole kurz aus:

In der nativ in Python ausgefuehrten Form saehe es so aus:
1
if a == 1:
2
    b.next = 2
3
    v.next = True
4
elif a == 2:
5
    b.next = 1
6
    v.next = False
7
else:
8
    b.next = 4
9
    v.next = False

Daraus z.B. C-Code zu erzeugen geht nicht direkt per Generierung, 
sondern nur per vorherige Uebersetzung per AST (abstract syntax tree) in 
ein ein explizites Konstrukt wie hier:
1
  yield (
2
    context.If(a == 1).Then(
3
      b.set(2), v.set(True)
4
    ).Elif(a == 2).Then(
5
      b.set(1), v.set(False)
6
    ).Else(
7
      b.set(4), v.set(False)
8
    )
9
  )

Python ist leider dahingehend eingeschraenkt, dass man nicht einfach 
zwischen Generatoren und Ausfuehrung umschalten kann. Dazu muesste man 
eine Konditional-Struktur-Klasse (if, else, ..) ableiten sowie die 
Zuweisung ('=') per Metaprogrammierung umbiegen koennen.

Aus obigem laesst sich direkt per Ausfuehrung in Zielcode (gemaess 
`context`) transpilieren (hat einige Vorteile, das so zu tun).

Gibt noch ein paar andere Moeglichkeiten der lesbareren Darstellung.
Die Problemstellung sollte somit etwas plastischer geworden sein :-).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.