Funktion aufrufen ohne Klammern ()

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
mankorkas
User
Beiträge: 1
Registriert: Mittwoch 26. Oktober 2016, 17:42

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]
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Es gibt in dieser Hinsicht keinen Unterschied zwischen

Code: Alles auswählen

foo = 1
foo
und

Code: Alles auswählen

def foo():
    pass
foo
Wieso sollte letzteres zu einem Fehler führen, wenn ersteres zu keinem Fehler führt?
BlackJack

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:

Code: Alles auswählen

foo = bar
# vs.
foo = bar()
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.
Benutzeravatar
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:

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>
Dann funktioniert sogar das hier:

Code: Alles auswählen

In [6]: foo = bar()()

In [7]: foo
Out[7]: <function __main__.bar>
Sozusagen die ultimative Fixpunktfunktion...
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@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.
Benutzeravatar
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.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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]
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.
BlackJack

@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>
Antworten