Hallo allerseits,
normalerweise wird eine Funktion ja myFunction() aufgerufen.
Wenn ich aber myFunction so, ohne Klammern eingebe gibt es leider keine Fehlermeldung!?
Wieso eigentlich?
Beste Grüße
[codebox=text file=Unbenannt.txt][/code]
Funktion aufrufen ohne Klammern ()
Es gibt in dieser Hinsicht keinen Unterschied zwischen
und
Wieso sollte letzteres zu einem Fehler führen, wenn ersteres zu keinem Fehler führt?
Code: Alles auswählen
foo = 1
foo
Code: Alles auswählen
def foo():
pass
foo
Die meiner Meinung nach noch wichtigere Frage ist, wenn es einen Aufruf ohne Klammern gäbe, wie man dann diese beiden Fälle unterscheiden will:
Denn das hat unterschiedliche Bedeutung und beide können Sinn machen. Und wie sollte Python in dieser Situation entscheiden ob `bar` aufgerufen werden soll oder nicht, wenn Aufrufe auch ohne Klammer funktionieren würden.
Code: Alles auswählen
foo = bar
# vs.
foo = bar()
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@BlackJack: Dazu braucht man doch bloß bar() so implementieren, dass immer dasselbe herauskommt:Dann funktioniert sogar das hier:Sozusagen die ultimative Fixpunktfunktion...
Code: Alles auswählen
In [1]: def bar():
...: return bar
...:
In [2]: foo = bar
In [3]: foo
Out[3]: <function __main__.bar>
In [4]: foo = bar()
In [5]: foo
Out[5]: <function __main__.bar>
Code: Alles auswählen
In [6]: foo = bar()()
In [7]: foo
Out[7]: <function __main__.bar>
In specifications, Murphy's Law supersedes Ohm's.
@pillmuncher: Dann kann die Funktion aber kein anderes Ergebnis mehr haben und wenn sie eher eine Prozedur ist, dann hat sie auch einen Effekt wenn man eigentlich nur die Prozedur zuweisen wollte ohne sie auszuführen.
Natürlich kann man so eine automatische Aktivierung in einer Programmiersprache umsetzen, es gibt ja welche die das machen. Dann sind Funktionen entweder keine Werte oder man muss das dann irgendwie anders ausdrücken um es vom Aufruf zu unterscheiden. Zum Beispiel mit ``@foo`` vs. ``foo`` in FreeBASIC um dem Compiler zu sagen das man gerne die Adresse der Funktion/des Unterprogramms haben möchte und nicht das Ergebnis vom Aufruf, oder mit ``someObject getSlot("foo")`` in Io um explizit das Objekt mit dem Namen `foo` von einem Objekt abzufragen ohne das es ausgeführt wird. Und dann muss man darauf die `call`-Methode aufrufen. Das finde ich eher hässlich und umständlich gelöst. In Python wäre das dann ein ``locals()['foo']`` oder ein ``getattr(some_object, 'foo')``-Aufruf.
Natürlich kann man so eine automatische Aktivierung in einer Programmiersprache umsetzen, es gibt ja welche die das machen. Dann sind Funktionen entweder keine Werte oder man muss das dann irgendwie anders ausdrücken um es vom Aufruf zu unterscheiden. Zum Beispiel mit ``@foo`` vs. ``foo`` in FreeBASIC um dem Compiler zu sagen das man gerne die Adresse der Funktion/des Unterprogramms haben möchte und nicht das Ergebnis vom Aufruf, oder mit ``someObject getSlot("foo")`` in Io um explizit das Objekt mit dem Namen `foo` von einem Objekt abzufragen ohne das es ausgeführt wird. Und dann muss man darauf die `call`-Methode aufrufen. Das finde ich eher hässlich und umständlich gelöst. In Python wäre das dann ein ``locals()['foo']`` oder ein ``getattr(some_object, 'foo')``-Aufruf.
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@BlackJack: Und da dachte ich, meine letzte Zeile hätte deutlich gemacht, dass mein Beitrag sarkastisch gemeint war...
In specifications, Murphy's Law supersedes Ohm's.
- Sr4l
- User
- Beiträge: 1091
- Registriert: Donnerstag 28. Dezember 2006, 20:02
- Wohnort: Kassel
- Kontaktdaten:
Wenn man Funktionen übergeben will (häufig z.B bei GUI Programmierung) dann übergibt man die Funktion ohne Klammern. Dafür braucht man das Verhalten z.B.mankorkas hat geschrieben:Hallo allerseits,
normalerweise wird eine Funktion ja myFunction() aufgerufen.
Wenn ich aber myFunction so, ohne Klammern eingebe gibt es leider keine Fehlermeldung!?
Wieso eigentlich?
Beste Grüße
[codebox=text file=Unbenannt.txt][/code]
@pillmuncher: Jain, für mich schon, aber für Anfänger und anderen denen vielleicht noch nicht so klar ist was „Funktionen als Bürger erster Klasse“ in der Praxis bedeutet, ist das vielleicht nicht so klar.
@Sr4l: <pedantic>Man übergibt dort die Funktion. Mit Klammern wäre es ja nicht mehr die Funktion, sondern deren Rückgabewert von dem Aufruf den man durch die Klammern auslöst.</pedantic>
@Sr4l: <pedantic>Man übergibt dort die Funktion. Mit Klammern wäre es ja nicht mehr die Funktion, sondern deren Rückgabewert von dem Aufruf den man durch die Klammern auslöst.</pedantic>