2016-09-21 6 views
1

Ich schreibe ein Skript, um ColdFusion CFML-Code in CFScript-Code zu übersetzen. An vielen Orten wird es ein Wörterbuch der Attribute nehmen, schauen durch eine Liste von Funktionen, und rufen Sie das erste, dessen Parameter erfüllen die Attribute mit dem Wörterbuch als Schlüsselwort argumente:Benennen Sie einen Positionsparameter "from"

import inspect 

def invokeFirst(attributes, *handlers): 
    given_args = set(attributes) 

    for handler in handlers: 
     meta = inspect.getargspec(handler) 

     allowed_args = set(meta.args) 
     required_args = set(meta.args[:-len(meta.defaults)]) if meta.defaults else meta.args 

     if required_args <= given_args and (meta.keywords or given_args <= allowed_args): 
      return handler(**attributes) 

    raise TypeError("Can't invoke with arguments {}.".format(str(given_args))) 

Anwendungsbeispiel:

Nun, da from kein gültiger Parametername ist, muss ich ihn im Lambda voranstellen und eine Menge zusätzlicher Logik zu invokeFirst hinzufügen (nicht gezeigt). Gibt es eine einfachere Problemumgehung, die die Syntax nicht am Ort der Verwendung aufbläht?

Antwort

1

Dies ist wahrscheinlich zu einfach für Ihren Anwendungsfall (oder Sie könnten dies sogar als "aufgebläht die Syntax am Ort der Verwendung"); Aber könnten Sie sich auf Pythons EAFP Prinzip verlassen: versuchen Sie, die Funktionen aufzurufen, und ignorieren Sie alle Ausnahmen? Etwas wie:

+0

In diesem Fall möchte ich auch eine Übereinstimmung fehlschlagen, wenn es Argumente gibt - auf diese Weise können unerwartete Attribute nicht stillschweigend verloren gehen. –

Verwandte Themen