Enumeration/Aufzählungstyp in Python vorhanden?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
byrd_cleveland
User
Beiträge: 8
Registriert: Donnerstag 28. Januar 2010, 19:45

Donnerstag 28. Januar 2010, 20:44

Hey Leute

ich bin gerade erst in Python reingerutscht. In der Schule machen wir etwas Delphi - und da habe ich was interessantes gesehen. Man kann da den "Wertebereich" einer Variablen festlegen. Die Variable akzeptiert dann bei einer Wertzuweisung nur noch 'Einträge', welche vorher festgelegt wurden. z.B. Werte von 0 bis 10 oder Farbnamen meinetwegen.

vielleicht gibt es in Python ja was ähnliches oder besseres ... wäre nett, wenn mich jemand aufklären könnte

(bei mir dreht es sich nicht um ein konkretes Programmierproblem sondern nur um Neugier)

gruß
Benutzeravatar
snafu
User
Beiträge: 5537
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Donnerstag 28. Januar 2010, 20:53

Nicht standardmäßig dabei, aber so in der Art als zusätzliches Modul verfügbar: enum.
shcol (Repo | Doc | PyPi)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Donnerstag 28. Januar 2010, 20:58

Er meint Constraints. Nein, gibt es so nativ nicht. Wenn du das wirklich brauchst, musst du dir das selbst hacken.

Ich weiß allerdings auch nicht, wozu man das brauchen würde.

Edit: Der Titel schreit nach Enums, der Inhalt nach Constraints.
Zuletzt geändert von Dauerbaustelle am Donnerstag 28. Januar 2010, 20:59, insgesamt 1-mal geändert.
byrd_cleveland
User
Beiträge: 8
Registriert: Donnerstag 28. Januar 2010, 19:45

Donnerstag 28. Januar 2010, 20:59

Danke für den Hinweis - schönen abend noch
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 29. Januar 2010, 00:51

Also eine ``BoundedInteger``-Klasse zu bauen ist eine Sache von Minuten...
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Freitag 29. Januar 2010, 01:17

@LeonidasDas ist aber nicht was der OP meint. In Pascal (Delphi) kann man Variablen, also Namen so deklarieren, dass sie nur Werte in dem Bereich annehmen. Das in Python konsequent nachzubauen wäre schon ziemlich krank.

@Dauerbaustelle: In Pascal heissen die Aufzählungstypen, wenn ich mich recht erinnere.
Benutzeravatar
snafu
User
Beiträge: 5537
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 29. Januar 2010, 03:09

byrd_cleveland hat geschrieben:Danke für den Hinweis - schönen abend noch
Du klingst wie ein Gelsenkirchener Dönermann. ;P

Zum Thema: Okay, ich mit meinen spärlichen C-Kenntnissen dachte jetzt, dass Enums zumindest in C, wenn sie irgendwo erwartet werden, nur in einem vorher definierten Wertebereich sein können bzw der/die/das jeweilige Enum benutzt werden muss. Offenbar ist das aber nicht so. Enum-Werte werden dort letztlich auch nur wie Ganzzahlen behandelt, wenn ich das richtig verstanden habe. Daher dachte ich, das beschriebene Delphi-Verhalten wäre auch das Verhalten in C, aber wenn man mal so drüber nachdenkt, gibt ja auch das Modul für Python am Ende Integer aus.

Naja, ohne das Delphi-Verhalten jetzt im Detail zu kennen, könnte man das vermutlich mit einer Klasse lösen, bei der man prüft, ob sie ein bestimmtes Attribut besitzt. Das ist aber relativ umständlich und wirkt auch nicht sehr pythonisch auf mich.

Du solltest dich IMHO generell von der Denke verabschieden, dass jede hereinkommende Variable (bzw in Python ja besser gesagt: Objekt) einer Typprüfung unterzogen wird. Gemäß dem Prinzip "Duck Typing" erwartet man nämlich quasi, dass das Objekt schon richtig ist und macht etwas damit (z.B. eine Methode aufrufen). Schlägt dies fehlt, so wird eine Ausnahme geworfen, die ggf abgefangen werden kann. Andernfalls immitierst du nämliche eine statische Programmiersprache, was genau das ist, was Python nicht sein will. Noch eine Sache: Du kannst Exceptions oft vermeiden (was meist ein Plus an Performance bringt), wenn du ggf vorhandene "Prüf-Funktionen" anwendest, dh.:

Code: Alles auswählen

d = {'foo': 'bar', 'ham': 'egg'}
if key in d:
    ...
#statt
try:
    value = d[key]
except KeyError:
    ...
#alternativ
value = d.get(key)
if value:
    ...
Aber ich drifte ab. Hoffe auch, keinen Mist erzählt zu haben, da das Bier etwas knallt. :lol:
shcol (Repo | Doc | PyPi)
BlackJack

Freitag 29. Januar 2010, 10:42

@snafu: Das ist aber keine allgemeine Alternative, da Du nicht unterscheiden kannst ob der Schlüssel nicht vorhanden war, oder ob der Wert nicht vielleich *tatsächlich* `None` ist. Oder bei Deinem Test sogar noch alles andere was als "falsch" betrachtet wird (leere Zeichenkette, Liste, Set, 0, `False`, …).
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Samstag 30. Januar 2010, 22:21

@Snafu

Ja, enums in C sind nur Zahlen mit ein wenig Syntax drumrum: http://paste.pocoo.org/show/171984/

Oder allgemeiner, in C sind alle Typen nur Zahlen und man casted, um zwischen verschiedenen Interpretationen für Zahlen zu wechseln. Deswegen kann man alles umhercasten wie man lustig ist und alles behandeln, wie es eben passt. Ein Array ist streng genommen auch nur ein Pointer auf den Anfang eines Speicherblocks (welcher wiederrum nur eine (positive) Zahl ist), eine Struktur eine Art Array mit expliziten Deklarationen von Typen an den entsprechenden Stellen des Speicherblocks. Die Grundtypen sind auch nur eine Anzahl von Bytes mit einer bestimmten Interpretation.
Antworten