Im Prozess der Entwicklung einer benutzerdefinierten Jinja2 -Erweiterung, die Namespaces mit dynamisch bewerteten Namen erstellt, muss ich das Ergebnis der Bewertung eines Template -Expression als Argument für einen -Namen verwenden Knoten. AST -Knoten. Das Problem ist jedoch, dass der AST aus der statischen Bewertung resultiert, während der Ausdruck eine Laufzeitbewertung erfordert (da Ausdrücke Variablen enthalten können, deren Wert zum Zeitpunkt der Analyse nicht bekannt ist). Gibt es eine Möglichkeit, diese Lücke zu überbrücken?
{% set my_name = 'my_namespace' %}
{% namespace my_name %}
{# A namespace named 'my_namespace' should now exists #}
Natürlich kann ich den Namen problemlos analysieren und das Ergebnis seiner Bewertung mit einem Ausgang Knoten. Ich kann auch Namespaces mit vordefinierten wörtlichen Namen erstellen: < /p>
from jinja2 import nodes
from jinja2.ext import Extension
class NamespaceExtension(Extension):
tags = {"namespace"}
def __init__(self, environment):
super().__init__(environment)
def parse(self, parser):
lineno = next(parser.stream).lineno
eval_context = nodes.EvalContext(self.environment)
name = parser.parse_expression()
##
## This obviously works as expected and outputs the result
## of evaluating `name` as an expression.
##
return nodes.Output([name]).set_lineno(lineno)
##
## This below also works — as a proof of concept — but we
## need the namespace name to be evaluated dynamically.
##
# return nodes.Assign(
# nodes.Name('my_namespace', 'store'),
# nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None)
# ).set_lineno(lineno)
namespace = NamespaceExtension
< /code>
Die folgenden Versuche funktionieren jedoch nicht (ich hatte tatsächlich nur Hoffnung im ersten zu längeren Versuch, also nicht allzu überrascht in den meisten anderen, aber hier sind sie dennoch, wenn auch nur aus Vollständigkeit und Demonstration). < /p>
return nodes.Assign(
name,
nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None)
).set_lineno(lineno)
# SyntaxError: cannot assign to function call
< /code>
Richtig, wir brauchen den Wert des Ausdrucks. < /p>
return nodes.Assign(
name.as_const(),
nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None)
).set_lineno(lineno)
# RuntimeError: if no eval context is passed, the node must have an attached environment.
< /code>
Nun, ok, einfach genug. < /p>
return nodes.Assign(
name.as_const(eval_context),
nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None)
).set_lineno(lineno)
# jinja2.nodes.Impossible
< /code>
Möglicherweise haben Sie ein besseres Glück, die Umgebung anzubringen. < /p>
name.set_environment(self.environment)
return nodes.Assign(
name.as_const(),
nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None)
).set_lineno(lineno)
# jinja2.nodes.Impossible
Natürlich werden Ausdrücke standardmäßig mit einem "Laden" -Kontext analysiert und wir benötigen einen Namen Knoten mit einem "Speicher" -Kontext.
Im Prozess der Entwicklung einer benutzerdefinierten Jinja2 -Erweiterung, die Namespaces mit dynamisch bewerteten Namen erstellt, muss ich das Ergebnis der Bewertung eines Template -Expression als Argument für einen -Namen verwenden Knoten. AST -Knoten. Das [url=viewtopic.php?t=20324]Problem[/url] ist jedoch, dass der AST aus der statischen Bewertung resultiert, während der Ausdruck eine Laufzeitbewertung erfordert (da Ausdrücke Variablen enthalten können, deren Wert zum Zeitpunkt der Analyse nicht bekannt ist). Gibt es eine Möglichkeit, diese Lücke zu überbrücken?[code]{% set my_name = 'my_namespace' %} {% namespace my_name %} {# A namespace named 'my_namespace' should now exists #} [/code] Natürlich kann ich den Namen problemlos analysieren und das Ergebnis seiner Bewertung mit einem Ausgang Knoten. Ich kann auch Namespaces mit vordefinierten wörtlichen Namen erstellen: < /p> [code]from jinja2 import nodes from jinja2.ext import Extension
namespace = NamespaceExtension < /code> Die folgenden Versuche funktionieren jedoch nicht (ich hatte tatsächlich nur Hoffnung im ersten zu längeren Versuch, also nicht allzu überrascht in den meisten anderen, aber hier sind sie dennoch, wenn auch nur aus Vollständigkeit und Demonstration). < /p> return nodes.Assign( name, nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None) ).set_lineno(lineno)
# SyntaxError: cannot assign to function call < /code> Richtig, wir brauchen den Wert des Ausdrucks. < /p> return nodes.Assign( name.as_const(), nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None) ).set_lineno(lineno)
# RuntimeError: if no eval context is passed, the node must have an attached environment. < /code> Nun, ok, einfach genug. < /p> return nodes.Assign( name.as_const(eval_context), nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None) ).set_lineno(lineno)
# jinja2.nodes.Impossible < /code> Möglicherweise haben Sie ein besseres Glück, die Umgebung anzubringen. < /p> name.set_environment(self.environment) return nodes.Assign( name.as_const(), nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None) ).set_lineno(lineno)
# jinja2.nodes.Impossible [/code] Natürlich werden Ausdrücke standardmäßig mit einem "Laden" -Kontext analysiert und wir benötigen einen Namen Knoten mit einem "Speicher" -Kontext. [code]name.set_ctx('store') return nodes.Assign( name, nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None) ).set_lineno(lineno)
# SyntaxError: cannot assign to function call [/code] Wie wäre es mit dem Namen Ausdruck im 'Load' Kontext in einem Namen Knoten mit einem "Speicher" -Kontext? [code]return nodes.Assign( nodes.Name(name, 'store'), nodes.Call(nodes.Name('namespace', 'load'), [], [], None, None) ).set_lineno(lineno)
// class definition - to simulate and create a Dice class and execute its methods
class Dice
{
// properties
int dotCount = 1; // initializing the dice to show side with 1 dot for testing
Ich möchte eine Liste überprüfen und eine Ausnahme auslösen, wenn die Liste mehrere IDs enthält, indem ich den Lambda-Ausdruck verwende:
final List carUuidList = carRepository.getUuidList();
Ich habe EvalEx ( verwendet und es modifiziert, um einen Rechner ohne Pakete wie math zu erstellen.
sodass er jetzt eine Eingabe in String-Form vom Benutzer erhalten kann und Drucken Sie das Ergebnis...
Ich bin neu auf C# und nsubstitute - ich habe eine harte Zeit gehabt, eine Mind -Funktion zu vermeiden und es hat ein Ref -Argument. Ich habe eine Kombination dieser Dokumente und diese Dokumente...