Wählen Sie die Python-Funktion zum Aufrufen basierend auf einer Regex
Ist es möglich, eine Funktion in einer Datenstruktur, ohne zuerst geben Sie einen Namen mit def
?
# This is the behaviour I want. Prints "hi".
def myprint(msg):
print msg
f_list = [ myprint ]
f_list[0]('hi')
# The word "myprint" is never used again. Why litter the namespace with it?
Den Körper einer lambda-Funktion ist stark eingeschränkt, so kann ich Sie nicht benutzen.
Edit: als Referenz, dies ist mehr wie real-life-code, wo ich das problem aufgetreten ist.
def handle_message( msg ):
print msg
def handle_warning( msg ):
global num_warnings, num_fatals
num_warnings += 1
if ( is_fatal( msg ) ):
num_fatals += 1
handlers = (
( re.compile( '^<\w+> (.*)' ), handle_message ),
( re.compile( '^\*{3} (.*)' ), handle_warning ),
)
# There are really 10 or so handlers, of similar length.
# The regexps are uncomfortably separated from the handler bodies,
# and the code is unnecessarily long.
for line in open( "log" ):
for ( regex, handler ) in handlers:
m = regex.search( line )
if ( m ): handler( m.group(1) )
InformationsquelleAutor der Frage Tim | 2011-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese basiert auf Udi ' s nette Antwort.
Ich denke, dass die Schwierigkeit der Erstellung von anonymen Funktionen ist ein bisschen ein Ablenkungsmanöver. Was Sie wirklich wollen, zu tun zu halten von den zugehörigen code zusammen, und machen den code ordentlich. Also ich denke, Dekorateure kann für Sie arbeiten.
InformationsquelleAutor der Antwort Gareth Rees
Schöner TROCKENER Weg zur Lösung Ihrer eigentlichen problem:
InformationsquelleAutor der Antwort Udi
Weiterhin Gareth ist sauberen Ansatz mit einem modularen self contained Lösung:
InformationsquelleAutor der Antwort Udi
Wenn Sie möchten, um eine saubere namespace, verwenden Sie del:
InformationsquelleAutor der Antwort Udi
Wie gesagt, dies kann nicht getan werden. Sie können aber annähernd.
myprint
ist effektiv anonym hier, da der variable Bereich, in dem es erstellt wurde ist nicht mehr erreichbar für den Anrufer. (Siehe closures in Python.)InformationsquelleAutor der Antwort robert
Wenn Sie sind besorgt über die Verschmutzung des namespace, erstellen Sie Ihre Funktionen innerhalb einer anderen Funktion. Dann sind Sie nur "verschmutzen" den lokalen namespace des
create_functions
Funktion und nicht die äußere namespace.InformationsquelleAutor der Antwort FogleBird
Sollten Sie es nicht tun, verursachen eval ist böse, aber Sie können die Funktion kompilieren von code zur Laufzeit mit
FunctionType
undkompilieren
:InformationsquelleAutor der Antwort Udi
Als alle sagten lambda ist der einzige Weg, aber Sie haben zu denken, nicht über lambda Einschränkungen, sondern wie man Sie vermeiden kann - zum Beispiel können Sie Listen verwenden, dicts, Verstehens und so weiter, um zu tun, was Sie wollen:
BEARBEITET mit print(versuchen Sie, Blick auf die pprint-Modul) und control-flow:
InformationsquelleAutor der Antwort Artsiom Rudzenka
Python wirklich, wirklich nicht wollen, dies zu tun. Nicht nur, dass es keine Möglichkeit zur Definition einer multi-line-anonyme Funktion, aber Funktion Definitionen nicht wieder die Funktion, also auch wenn dies syntaktisch gültig ist...
... es immer noch nicht funktionieren würde. (Obwohl ich denke, wenn es syntaktisch gültig, Sie würde machen Funktionsdefinitionen Rückkehr der Funktion, so dass es würde Arbeit.)
So schreiben Sie Ihre eigene Funktion, um eine Funktion aus einem string (mit
exec
natürlich) und pass in einer dreifach-quoted string. Es ist irgendwie hässlich syntaktisch, aber es funktioniert:Verwendung:
InformationsquelleAutor der Antwort kindall
Die einzige Möglichkeit, eine anonyme Funktion ist mit
lambda
und wie Sie wissen, können Sie enthalten nur einen einzelnen Ausdruck.Können Sie erstellen, die eine Reihe von Funktionen mit dem gleichen Namen, so wird man wenigstens nicht daran zu denken, neue Namen für jede.
Es wäre toll, um wirklich anonyme Funktionen, aber Python ist die syntax nicht unterstützen können Sie Sie leicht.
InformationsquelleAutor der Antwort Ned Batchelder
Persönlich würde ich nur nennen Sie es etwas verwenden, und nicht ärgern über Sie "hängen herum". Das einzige, was Sie gewinnen, indem Sie Vorschläge wie die Neudefinition später, oder mit
del
fallen die Namen aus dem namespace ist ein potential für Verwirrung und Fehler, wenn später jemand kommt und bewegt sich einige code, um ohne groking, was du tust.InformationsquelleAutor der Antwort John Gaines Jr.
Könnten Sie
exec
:InformationsquelleAutor der Antwort codeape
Die einzige option ist die Verwendung eines lambda-Ausdrucks, wie Sie erwähnen. Ohne dass, es ist nicht möglich. Das ist die Art, wie python funktioniert.
InformationsquelleAutor der Antwort thunderflower
Wenn Ihre Funktion ist kompliziert genug, um nicht fit zu
lambda
- Funktion, dann, zur besseren Lesbarkeit Willen, wäre es wahrscheinlich am besten definieren, die es in einem normalen block sowieso.InformationsquelleAutor der Antwort TorelTwiddler