<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="../../../glossary/#term-variable"><em class="xref std std-term">variable</em></a> for a <a class="reference internal" href="../../../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="../../../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="../../../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="s">"test.def"</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="../../../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="../../../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="../../../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="../../../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> |