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?
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. –