2015-11-20 12 views
11

Derzeit in Python, ein Parameter der Funktion und Rückgabetypen Typ wie folgt angedeutet sein kann:Ist es möglich, eine Lambda-Funktion anzugeben?

def func(var1: str, var2: str) -> int: 
    return var1.index(var2) 

was darauf hindeutet, dass die Funktion zwei Strings nimmt und gibt eine ganze Zahl ist.

Allerdings ist diese Syntax sehr verwirrend mit Lambda-Ausdrücke, die wie folgt aussehen:

func = lambda var1, var2: var1.index(var2) 

Ich habe versucht, in Art Hinweise auf beiden Parameter setzen und Return-Typen, und ich kann nicht einen Weg finden, dass verursacht keinen Syntaxfehler.

Ist es möglich, eine Lambda-Funktion einzugeben? Wenn nicht, gibt es Pläne für Typ-Hint-Lambdas oder irgendeinen Grund (außer dem offensichtlichen Syntaxkonflikt) warum nicht?

+0

Ich denke, dass der üblicher Anwendungsfall für ein Lambda innerhalb einer anderen Funktion verschachtelt ist (mit regulären Funktionen gegenüber, die an einer Stelle definiert und aufgerufen Irgendwo ganz anders). Wenn Sie die Typen in dieser Funktion bereits kennen, sollte es (im Prinzip) ziemlich einfach sein, herauszufinden, welche Typen dieses Lambda erhalten wird. Außerdem würde das Ändern der Syntax für die Unterstützung von Anmerkungen dazu führen, dass Ihr Lambda _harder_ gelesen wird. – mgilson

Antwort

8

Nein, Sie können keine Annotationen (die Syntax, nach denen Pythons Typhinweis erstellt wird) mit lambda Ausdrücken verwenden. Die Syntax ist nur für def Funktionsanweisungen verfügbar.

Von PEP 3107 - Function Annotations:

Lambda ‚s Syntax unterstützt keine Anmerkungen. Die Syntax von Lambda könnte geändert werden, um Annotationen zu unterstützen, indem Klammern um die Parameterliste benötigt werden. Aber es was decided diese Änderung nicht zu machen, weil:

  • Es wäre eine inkompatible Änderung.
  • Lambda's sind sowieso kastriert.
  • Der Lambda kann immer in eine Funktion geändert werden.

Sie können immer noch die Anmerkungen direkt auf das Objekt anhängen, das function.__annotations__ Attribut ist ein beschreibbarer Wörterbuch:

>>> def func(var1: str, var2: str) -> int: 
...  return var1.index(var2) 
... 
>>> func.__annotations__ 
{'var1': <class 'str'>, 'return': <class 'int'>, 'var2': <class 'str'>} 
>>> lfunc = lambda var1, var2: var1.index(var2) 
>>> lfunc.__annotations__ 
{} 
>>> lfunc.__annotations__['var1'] = str 
>>> lfunc.__annotations__['var2'] = str 
>>> lfunc.__annotations__['return'] = int 
>>> lfunc.__annotations__ 
{'var1': <class 'str'>, 'return': <class 'int'>, 'var2': <class 'str'>} 

Nicht dass dynamische Anmerkungen wie diese werden Ihnen helfen, wenn Sie ausführen wollte Ein statischer Analysator über Ihren Typ deutet natürlich an.

+0

Wissen Sie, ob es eine absichtliche Wahl war, Annotationen auf Lambdas zu verbieten? –

+0

Das ergibt sich aus der Mischung funktionaler Sprachfunktionen mit imperativen Sprachen. Unnötig, sinnlos. – pbhowmick

+0

@NathanMerrill: Wie würde das in die Ausdruckssyntax passen? Ich denke nicht, dass es viel Sinn macht, die Anwendungsfälle sind einfach ganz anders. –

4

Seit Python 3.6 können Sie (siehe PEP 526):

from typing import Callable 
is_even: Callable[[int], bool] = lambda x: (x % 2 == 0) 
Verwandte Themen