Seite 1 von 1

Funktion aufrufen ohne Klammern ()

Verfasst: Mittwoch 26. Oktober 2016, 17:45
von mankorkas
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]

Re: Funktion aufrufen ohne Klammern ()

Verfasst: Mittwoch 26. Oktober 2016, 18:22
von DasIch
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?

Re: Funktion aufrufen ohne Klammern ()

Verfasst: Mittwoch 26. Oktober 2016, 19:26
von 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.

Re: Funktion aufrufen ohne Klammern ()

Verfasst: Donnerstag 27. Oktober 2016, 08:14
von pillmuncher
@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...

Re: Funktion aufrufen ohne Klammern ()

Verfasst: Donnerstag 27. Oktober 2016, 10:29
von 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.

Re: Funktion aufrufen ohne Klammern ()

Verfasst: Donnerstag 27. Oktober 2016, 12:47
von pillmuncher
@BlackJack: Und da dachte ich, meine letzte Zeile hätte deutlich gemacht, dass mein Beitrag sarkastisch gemeint war...

Re: Funktion aufrufen ohne Klammern ()

Verfasst: Freitag 28. Oktober 2016, 10:04
von Sr4l
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.

Re: Funktion aufrufen ohne Klammern ()

Verfasst: Freitag 28. Oktober 2016, 11:53
von 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>