<div class="section" id="variable-inheritance">
<span id="index-0"></span><span id="id1"></span>
<div class="line-block">
<div class="line">In the previous chapter, we saw how to define a <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-variable"><em class="xref std std-term">variable</em></a> for a <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-task"><em class="xref std std-term">task</em></a>.</div>
<div class="line">When all the tasks of the same <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-family"><em class="xref std std-term">family</em></a> share the same variable value,</div>
<div class="line">the value could be defined at the family level.</div>
<div class="line">This is termed <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-variable-inheritance"><em class="xref std std-term">variable inheritance</em></a></div>
</div>
<div class="highlight-python"><pre># Definition of the suite test.
suite test
edit ECF_INCLUDE "$HOME/course"
edit ECF_HOME "$HOME/course"
family f1
edit SLEEP 20
task t1
task t2
endfamily
endsuite</pre>
</div>
<p>Or in python:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/env python2.5</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">ecflow</span>
<span class="k">def</span> <span class="nf">create_family_f1</span><span class="p">():</span>
<span class="n">f1</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Family</span><span class="p">(</span><span class="s">"f1"</span><span class="p">)</span>
<span class="n">f1</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">"SLEEP"</span><span class="p">,</span><span class="mi">20</span><span class="p">)</span>
<span class="n">f1</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="s">"t1"</span><span class="p">)</span>
<span class="n">f1</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="s">"t2"</span><span class="p">)</span>
<span class="k">return</span> <span class="n">f1</span>
<span class="n">defs</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Defs</span><span class="p">()</span>
<span class="n">suite</span> <span class="o">=</span> <span class="n">defs</span><span class="o">.</span><span class="n">add_suite</span><span class="p">(</span><span class="s">"test"</span><span class="p">)</span>
<span class="n">suite</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">"ECF_INCLUDE"</span><span class="p">,</span><span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s">"HOME"</span><span class="p">)</span> <span class="o">+</span> <span class="s">"/course"</span><span class="p">)</span>
<span class="n">suite</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">"ECF_HOME "</span><span class="p">,</span><span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s">"HOME"</span><span class="p">)</span> <span class="o">+</span> <span class="s">"/course"</span><span class="p">)</span>
<span class="n">suite</span><span class="o">.</span><span class="n">add_family</span><span class="p">(</span> <span class="n">create_family_f1</span><span class="p">()</span> <span class="p">)</span>
</pre></div>
</div>
<div class="line-block">
<div class="line">The <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-variable"><em class="xref std std-term">variable</em></a> could have been defined at the level of the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-suite"><em class="xref std std-term">suite</em></a>,</div>
<div class="line">achieving the same results. Variables are inherited from the parent node.</div>
<div class="line">If a variable is redefined lower in the tree, it is said to be overridden.</div>
<div class="line">In this case the new definition is the one being used.</div>
<div class="line">It is possible to override generated variables.</div>
<div class="line">This is not recommended and you should understand all the consequences</div>
<div class="line">if you decide to do so.</div>
</div>
<p>Let us have a quiz. Consider the following suite:</p>
<div class="highlight-python"><pre>suite test
edit SLEEP 100
family f1
edit SLEEP 80
task t1
task t2
edit SLEEP 9
family g1
edit SLEEP 89
task x1
edit SLEEP 10
task x2
endfamily
endfamily
family f2
task t1
task t2
edit SLEEP 77
family g2
task x1
edit SLEEP 12
task x2
endfamily
endfamily
endsuite</pre>
</div>
<p>What is the value of the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-variable"><em class="xref std std-term">variable</em></a> SLEEP for:</p>
<blockquote>
<div><table border="1" class="docutils">
<colgroup>
<col width="70%" />
<col width="30%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head"><a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-node"><em class="xref std std-term">node</em></a></th>
<th class="head">SLEEP</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>test/f1/t1</td>
<td>?</td>
</tr>
<tr><td>/test/f1/t2</td>
<td>?</td>
</tr>
<tr><td>/test/f1/g1/x1</td>
<td>?</td>
</tr>
<tr><td>/test/f1/g1/x2</td>
<td>?</td>
</tr>
<tr><td>/test/f2/t1</td>
<td>?</td>
</tr>
<tr><td>/test/f2/t2</td>
<td>?</td>
</tr>
<tr><td>/test/f2/g2/x1</td>
<td>?</td>
</tr>
<tr><td>/test/f2/g2/x2</td>
<td>?</td>
</tr>
</tbody>
</table>
</div></blockquote>
</div>
{html} |