@@ -44,6 +44,7 @@ <h1>Source code for ete4.treematcher.treematcher</h1><div class="highlight"><pre
4444< span class ="kn "> import</ span > < span class ="w "> </ span > < span class ="nn "> re</ span >
4545
4646< span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> ete4</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> Tree</ span >
47+ < span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> ete4.core.eval</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> eval_on_node</ span >
4748
4849
4950< div class ="viewcode-block " id ="TreePattern ">
@@ -108,32 +109,7 @@ <h1>Source code for ete4.treematcher.treematcher</h1><div class="highlight"><pre
108109 < span class ="k "> if</ span > < span class ="n "> pattern</ span > < span class ="o "> .</ span > < span class ="n "> children</ span > < span class ="ow "> and</ span > < span class ="nb "> len</ span > < span class ="p "> (</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> children</ span > < span class ="p "> )</ span > < span class ="o "> !=</ span > < span class ="nb "> len</ span > < span class ="p "> (</ span > < span class ="n "> pattern</ span > < span class ="o "> .</ span > < span class ="n "> children</ span > < span class ="p "> ):</ span >
109110 < span class ="k "> return</ span > < span class ="kc "> False</ span > < span class ="c1 "> # no match if there's not the same number of children</ span >
110111
111- < span class ="n "> context</ span > < span class ="o "> =</ span > < span class ="n "> context</ span > < span class ="ow "> or</ span > < span class ="p "> {}</ span >
112- < span class ="n "> context_base</ span > < span class ="o "> =</ span > < span class ="p "> {</ span >
113- < span class ="s1 "> 'node'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="p "> ,</ span >
114- < span class ="s1 "> 'name'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> props</ span > < span class ="o "> .</ span > < span class ="n "> get</ span > < span class ="p "> (</ span > < span class ="s1 "> 'name'</ span > < span class ="p "> ,</ span > < span class ="s1 "> ''</ span > < span class ="p "> ),</ span > < span class ="c1 "> # node.name could be None</ span >
115- < span class ="s1 "> 'dist'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> dist</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'd'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> dist</ span > < span class ="p "> ,</ span >
116- < span class ="s1 "> 'support'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> support</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'sup'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> support</ span > < span class ="p "> ,</ span >
117- < span class ="s1 "> 'up'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> up</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'parent'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> up</ span > < span class ="p "> ,</ span >
118- < span class ="s1 "> 'children'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> children</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'ch'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> children</ span > < span class ="p "> ,</ span >
119- < span class ="s1 "> 'is_leaf'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> is_leaf</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'is_root'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> is_root</ span > < span class ="p "> ,</ span >
120- < span class ="s1 "> 'props'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> props</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'p'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> props</ span > < span class ="p "> ,</ span >
121- < span class ="s1 "> 'species'</ span > < span class ="p "> :</ span > < span class ="nb "> getattr</ span > < span class ="p "> (</ span > < span class ="n "> node</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'species'</ span > < span class ="p "> ,</ span > < span class ="s1 "> ''</ span > < span class ="p "> ),</ span > < span class ="c1 "> # for PhyloTree</ span >
122- < span class ="s1 "> 'get'</ span > < span class ="p "> :</ span > < span class ="nb "> dict</ span > < span class ="o "> .</ span > < span class ="n "> get</ span > < span class ="p "> ,</ span >
123- < span class ="s1 "> 'size'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> size</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'dx'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> size</ span > < span class ="p "> [</ span > < span class ="mi "> 0</ span > < span class ="p "> ],</ span > < span class ="s1 "> 'dy'</ span > < span class ="p "> :</ span > < span class ="n "> node</ span > < span class ="o "> .</ span > < span class ="n "> size</ span > < span class ="p "> [</ span > < span class ="mi "> 1</ span > < span class ="p "> ],</ span >
124- < span class ="s1 "> 'regex'</ span > < span class ="p "> :</ span > < span class ="n "> re</ span > < span class ="o "> .</ span > < span class ="n "> search</ span > < span class ="p "> ,</ span >
125- < span class ="s1 "> 'startswith'</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="o "> .</ span > < span class ="n "> startswith</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'endswith'</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="o "> .</ span > < span class ="n "> endswith</ span > < span class ="p "> ,</ span >
126- < span class ="s1 "> 'upper'</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="o "> .</ span > < span class ="n "> upper</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'lower'</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="o "> .</ span > < span class ="n "> lower</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'split'</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="o "> .</ span > < span class ="n "> split</ span > < span class ="p "> ,</ span >
127- < span class ="s1 "> 'any'</ span > < span class ="p "> :</ span > < span class ="nb "> any</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'all'</ span > < span class ="p "> :</ span > < span class ="nb "> all</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'len'</ span > < span class ="p "> :</ span > < span class ="nb "> len</ span > < span class ="p "> ,</ span >
128- < span class ="s1 "> 'sum'</ span > < span class ="p "> :</ span > < span class ="nb "> sum</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'abs'</ span > < span class ="p "> :</ span > < span class ="nb "> abs</ span > < span class ="p "> ,</ span > < span class ="s1 "> 'float'</ span > < span class ="p "> :</ span > < span class ="nb "> float</ span > < span class ="p "> }</ span >
129-
130- < span class ="k "> for</ span > < span class ="n "> k</ span > < span class ="ow "> in</ span > < span class ="n "> context</ span > < span class ="p "> :</ span >
131- < span class ="k "> assert</ span > < span class ="n "> k</ span > < span class ="ow "> not</ span > < span class ="ow "> in</ span > < span class ="n "> context_base</ span > < span class ="p "> ,</ span > < span class ="sa "> f</ span > < span class ="s1 "> 'colliding name: </ span > < span class ="si "> {</ span > < span class ="n "> k</ span > < span class ="si "> }</ span > < span class ="s1 "> '</ span >
132-
133- < span class ="n "> eval_context</ span > < span class ="o "> =</ span > < span class ="nb "> dict</ span > < span class ="p "> (</ span > < span class ="n "> context_base</ span > < span class ="p "> ,</ span > < span class ="o "> **</ span > < span class ="n "> context</ span > < span class ="p "> )</ span > < span class ="c1 "> # merge dicts</ span >
134-
135- < span class ="n "> evaluate</ span > < span class ="o "> =</ span > < span class ="n "> safer_eval</ span > < span class ="k "> if</ span > < span class ="n "> pattern</ span > < span class ="o "> .</ span > < span class ="n "> safer</ span > < span class ="k "> else</ span > < span class ="nb "> eval</ span > < span class ="c1 "> # risky business</ span >
136- < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> evaluate</ span > < span class ="p "> (</ span > < span class ="n "> pattern</ span > < span class ="o "> .</ span > < span class ="n "> props</ span > < span class ="p "> [</ span > < span class ="s1 "> 'code'</ span > < span class ="p "> ],</ span > < span class ="n "> eval_context</ span > < span class ="p "> ):</ span >
112+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> eval_on_node</ span > < span class ="p "> (</ span > < span class ="n "> pattern</ span > < span class ="o "> .</ span > < span class ="n "> props</ span > < span class ="p "> [</ span > < span class ="s1 "> 'code'</ span > < span class ="p "> ],</ span > < span class ="n "> node</ span > < span class ="p "> ,</ span > < span class ="n "> context</ span > < span class ="p "> ,</ span > < span class ="n "> pattern</ span > < span class ="o "> .</ span > < span class ="n "> safer</ span > < span class ="p "> ):</ span >
137113 < span class ="k "> return</ span > < span class ="kc "> False</ span > < span class ="c1 "> # no match if the condition for this node if false</ span >
138114
139115 < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> pattern</ span > < span class ="o "> .</ span > < span class ="n "> children</ span > < span class ="p "> :</ span >
@@ -157,19 +133,6 @@ <h1>Source code for ete4.treematcher.treematcher</h1><div class="highlight"><pre
157133 < span class ="k "> if</ span > < span class ="n "> match</ span > < span class ="p "> (</ span > < span class ="n "> pattern</ span > < span class ="p "> ,</ span > < span class ="n "> node</ span > < span class ="p "> ,</ span > < span class ="n "> context</ span > < span class ="p "> ):</ span >
158134 < span class ="k "> yield</ span > < span class ="n "> node</ span > </ div >
159135
160-
161-
162- < span class ="c1 "> # Calling eval() directly in match() can be a security problem. Specially for</ span >
163- < span class ="c1 "> # web services, we are better off using this following function:</ span >
164- < div class ="viewcode-block " id ="safer_eval ">
165- < a class ="viewcode-back " href ="../../../reference/reference_treematcher.html#ete4.treematcher.treematcher.safer_eval "> [docs]</ a >
166- < span class ="k "> def</ span > < span class ="w "> </ span > < span class ="nf "> safer_eval</ span > < span class ="p "> (</ span > < span class ="n "> code</ span > < span class ="p "> ,</ span > < span class ="n "> context</ span > < span class ="p "> ):</ span >
167- < span class ="w "> </ span > < span class ="sd "> """Return a safer version of eval(code, context)."""</ span >
168- < span class ="k "> for</ span > < span class ="n "> name</ span > < span class ="ow "> in</ span > < span class ="n "> code</ span > < span class ="o "> .</ span > < span class ="n "> co_names</ span > < span class ="p "> :</ span >
169- < span class ="k "> if</ span > < span class ="n "> name</ span > < span class ="ow "> not</ span > < span class ="ow "> in</ span > < span class ="n "> context</ span > < span class ="p "> :</ span >
170- < span class ="k "> raise</ span > < span class ="ne "> ValueError</ span > < span class ="p "> (</ span > < span class ="s1 "> 'invalid use of </ span > < span class ="si "> %r</ span > < span class ="s1 "> during evaluation'</ span > < span class ="o "> %</ span > < span class ="n "> name</ span > < span class ="p "> )</ span >
171- < span class ="k "> return</ span > < span class ="nb "> eval</ span > < span class ="p "> (</ span > < span class ="n "> code</ span > < span class ="p "> ,</ span > < span class ="p "> {</ span > < span class ="s1 "> '__builtins__'</ span > < span class ="p "> :</ span > < span class ="p "> {}},</ span > < span class ="n "> context</ span > < span class ="p "> )</ span > </ div >
172-
173136</ pre > </ div >
174137
175138 </ div >
0 commit comments