Variablen-Scope in verschachtelten Generates¶
Wenn Du eine <variable> aus einem äußeren <generate> in ein
verschachteltes <generate> verschiebst, ändert sich der Besitzer des Werts.
Mache diese Ownership in jedem script=-Ausdruck sichtbar, damit im Review
eindeutig ist, ob der aktuelle oder der Parent-Datensatz gemeint ist.
Review-Regeln¶
- Verwende
this.<name>für einen Wert aus dem aktuellen verschachtelten Generate. - Verwende
this.parent.<name>, wenn der direkte Parent den Wert besitzt. - Verwende einen expliziten benannten Pfad nur, wenn das Modell bewusst einen bereits aufgebauten verschachtelten Zweig adressiert.
- Verwende
root.<name>für einen Wert aus dem Setup-Scope. - Lies Memstore-Daten über die öffentliche Scripting-API. Bilde keinen
Memstore-Datensatz mit einem lokal konstruierten
dictnach, nur um ihn zwischen Scopes zu verschieben.
Schnelle Entscheidungshilfe¶
| Du willst lesen... | Bevorzugte Form |
|---|---|
Einen Wert im aktuellen verschachtelten <generate> |
this.varName |
Einen Wert im direkten Parent-<generate> |
this.parent.varName |
| Einen Setup-Wert | root.varName |
| Einen bewusst benannten Zweig | child.grand_child.varName |
Ein unqualifizierter Name kann weiterhin auf einen äußeren Wert zeigen. Auf der obersten Ebene ist das kompakt, wird aber mehrdeutig, sobald derselbe Name in mehreren verschachtelten Generates vorkommt.
Beispiel 1: Memstore-Werte über die Scripting-API¶
Der Helfer hält die Memstore-Kommunikation hinter der unterstützten schreibgeschützten API:
| script/scope_memstore.scr.py | |
|---|---|
1 2 3 4 5 | |
Ein Wert des Parents¶
| scope-outer.xml | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
selected gehört zu batch. Das verschachtelte Generate liest den Wert daher
explizit aus this.parent.
Aktueller und Parent-Wert mit demselben Namen¶
| scope-shadowing.xml | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Die drei Ausdrücke machen ihre Ownership reviewbar: this.selected und
datFileCreation.selected lesen inner; this.parent.selected liest outer.
Beispiel 2: Cascade Generate und this.id¶
| scope-cascade.xml | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
Das äußere id bleibt unqualifiziert, weil es auf der obersten Ebene liegt.
Jedes verschachtelte id verwendet this.id; so bleibt trotz gleicher Namen
eindeutig, welcher Wert gelesen wird.
Beispiel 3: Zugriff über benannte Pfade¶
| scope-named-path.xml | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Verwende einen benannten Pfad, wenn der Pfad selbst fachlich zum Modell gehört.
Für einen rein lokalen Wert bleibt this.index leichter zu prüfen.
Beispiel 4: Explizite Pfade in nestedKey¶
| scope-nested-key.xml | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Der Pfad zeigt, dass contact bewusst Werte von send_info wiederverwendet.
Beispiel 5: Gemeinsam außen, lokal innen¶
| scope-shared-local.xml | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Die gemeinsam genutzte Customer-ID bleibt im Parent. Jedes Kind behält seinen eigenen lokalen Zeilenzähler und qualifiziert beide Zugriffe.
Fehlerdiagnose¶
| Symptom | Wahrscheinliche Ursache | Korrektur |
|---|---|---|
variable not found |
Der Wert gehört zu einem anderen Scope | Verwende this.<name>, this.parent.<name> oder den beabsichtigten benannten Pfad |
| Falscher Wert ohne Fehler | Ein unqualifizierter Name wurde gegen einen äußeren Wert aufgelöst | Qualifiziere aktuelle und Parent-Ownership explizit |
| Ein Pfad bricht nach einer Nesting-Änderung | Der benannte Zweig hat sich geändert | Bevorzuge this.* für lokale Werte und reserviere benannte Pfade für bewussten Zweigzugriff |
| Memstore-Logik legt Runtime-Objekte offen | Das Modell umgeht die öffentliche Grenze | Verschiebe den Zugriff nach datamimic_ee.scripting.load_memstore() oder load_memstore_page() |