srcML v1.0.0 Python Documentation

Base Elements XML Element Subelements
comment <comment type="line|hashbang">
literal <literal type="boolean|complex|ellipsis|null|number|string">
escape <escape char="0xXX">
name <name>
Statements XML Element Subelements
argument parameter <parameter type="args"> <annotation>,<expr>
assert statement <assert> <condition>
block <block> <block_content>
break statement <break>
case statement <case> <expr>,<block>,<alias>,<condition>
continue statement <continue>
delete <delete> <name>
execute statement <exec> <expr>
expression statement <expr_stmt> <expr>
for statement <for> <control>,<block>,<specifier>,<else>
global statement <global> <name>
if statement <if_stmt> <if>,<if type="elseif">,<else>
import statement <import> <from>,<name>,<alias>
keyword argument parameter <parameter type="kwargs"> <annotation>,<expr>
nonlocal <nonlocal> <name>
parameter <parameter> <annotation>,<expr>,<init>
parameter modifiers <parameter type="modifier">
pass statement <pass>
print statement <print> <expr>
return statement <return> <expr>
switch statement <switch> <condition>,<block>
while statement <while> <condition>,<block>,<else>
with statement <with> <specifier>,<alias>,<block>,<expr>
yield from statement <yield type="from"> <expr>
yield statement <yield> <expr>
Statement Subelements XML Element Subelements
alias <alias>
annotation <annotation>
block content <block_content>
condition <condition> <expr>
control <control> <init>,<condition>
else <else> <block>
else if <if type="elseif"> <condition>,<block>
expr <expr>
if <if> <condition>,<block>
super class <super>
Specifiers XML Element Subelements
async specifier <specifier>async</specifier>
Declarations, Definitions, and Initializations XML Element Subelements
declaration initialization <init>
function <function> <annotation>,<name>,<parameter_list>,<parameter_list type="generic">,<block>,<attribute>,<specifier>
lambda functions <lambda> <parameter>,<expr>
range <range> <expr>
typedef <typedef> <name>,<expr>
Classes, Structs, Unions, and Enums XML Element Subelements
class definition <class> <name>,<attribute>,<super_list>,<parameter_list type="generic">,<block>
inheritance list <super_list> <super>,<expr>
Expressions XML Element Subelements
argument <argument> <name>,<expr>
argument list <argument_list> <argument>
comprehension <comprehension> <for>,<specifier>,<control>,<range>,<if>
dictionary <dictionary> <expr>,<comprehension>
function call <call> <name>,<argument_list>
index <index> <expr>
list <array> <expr>,<comprehension>
operator <operator>
set <set> <expr>,<comprehension>
ternary operator <ternary> <condition>,<else>
tuple <tuple> <expr>
Other XML Element Subelements
attribute <attribute> <expr>
Templates XML Element Subelements
generic property <parameter_list type="generic"> <parameter>
parameter list <parameter_list> <parameter>
Exceptions XML Element Subelements
except statement <catch> <alias>,<expr>,<block>,<name>
finally <finally> <block>
throw <throw> <expr>,<from>
try <try> <block>,<catch>,<else>,<finally>

line comment


Element

  • <comment type="line">

XPath

srcQL

  • comments

    //src:comment
  • line comments

    //src:comment[@type='line']
  • find any line comment

    FIND src:comment[@type="line"]

Example

# line
<comment type="line"># line</comment>

hashbang comment


Element

  • <comment type="hashbang">

XPath

srcQL

  • comments

    //src:comment
  • hashbang comments

    //src:comment[@type='hashbang']
  • find any hashbang comment

    FIND src:comment[@type="hashbang"]

Example

#!/usr/bin/python3
<comment type="hashbang">#!/usr/bin/python3</comment>

number literal


Element

  • <literal type="number">123</literal>

XPath

srcQL

  • number literals

    //src:literal[@type='number']
  • abstract function declarations

    //src:function_decl[src:literal=0]
  • find any number literal

    FIND src:literal[@type="number"]

string literal


Element

  • <literal type="string">"Hello"</literal>

XPath

srcQL

  • string literals

    //src:literal[@type='string']
  • find any string literal

    FIND src:literal[@type="string"]

boolean literal


Element

  • <literal type="boolean">True</literal>

XPath

srcQL

  • boolean literals

    //src:literal[@type='boolean']
  • find any boolean literal

    FIND src:literal[@type="boolean"]
  • find any expression that contains True

    FIND True
  • find any expression that contains False

    FIND False

null literal


Element

  • <literal type="null">None</literal>

XPath

srcQL

  • null literals

    //src:literal[@type='null']
  • find any None

    FIND src:literal[@type="null"]
  • find any expression containing None

    FIND None

complex literal


Element

  • <literal type="complex">2 + 3j</literal>

XPath

srcQL

  • complex literals

    //src:literal[@type='complex']
  • find any complex literal

    FIND src:literal[@type="complex"]

ellipsis literal


Element

  • <literal type="ellipsis">...</literal>

XPath

srcQL

  • ellipsis literals

    //src:literal[@type='ellipsis']
  • find any ellipsis literal

    FIND src:literal[@type="ellipsis"]
  • find any expression with an ellipsis literal

    FIND ...

if statement


Element

  • <if_stmt>

Subelements

  • <if>
  • <if type="elseif">
  • <else>

XPath

srcQL

  • if conditions

    //src:if/src:condition
  • then

    //src:if/src:block
  • else

    //src:else/src:block
  • if statements without an else

    //src:if_stmt[not(src:else)]
  • else if

    //src:if[@type='elseif']
  • First if in a nested if statement

    //src:if_stmt/src:if[1]
  • Second if in a nested if statement

    //src:if_stmt/src:if[2]
  • Last if in a nested if statement

    //src:if_stmt/src:if[last()]
  • find any instance of an if statement

    FIND if $E:

Examples

if A:
    B
<if_stmt><if>if <condition><expr><name>A</name></expr></condition><block>:<block_content>
    <expr_stmt><expr><name>B</name></expr></expr_stmt></block_content></block></if></if_stmt>
if A:
    B
else:
    C
<if_stmt><if>if <condition><expr><name>A</name></expr></condition><block>:<block_content>
    <expr_stmt><expr><name>B</name></expr></expr_stmt>
</block_content></block></if><else>else<block>:<block_content>
    <expr_stmt><expr><name>C</name></expr></expr_stmt></block_content></block></else></if_stmt>
if A:
    B
elif A2:
    C
else:
    D
<if_stmt><if>if <condition><expr><name>A</name></expr></condition><block>:<block_content>
    <expr_stmt><expr><name>B</name></expr></expr_stmt>
</block_content></block></if><if type="elseif">elif <condition><expr><name>A2</name></expr></condition><block>:<block_content>
    <expr_stmt><expr><name>C</name></expr></expr_stmt>
</block_content></block></if><else>else<block>:<block_content>
    <expr_stmt><expr><name>D</name></expr></expr_stmt></block_content></block></else></if_stmt>
if(x > 5):
    y+=4
<if_stmt><if>if<condition><expr><operator>(</operator><name>x</name> <operator>&gt;</operator> <literal type="number">5</literal><operator>)</operator></expr></condition><block>:<block_content>
    <expr_stmt><expr><name>y</name><operator>+=</operator><literal type="number">4</literal></expr></expr_stmt></block_content></block></if></if_stmt>
if  i > 0 :
    y = x / i
<if_stmt><if>if  <condition><expr><name>i</name> <operator>&gt;</operator> <literal type="number">0</literal></expr></condition> <block>:<block_content>
    <expr_stmt><expr><name>y</name> <operator>=</operator> <name>x</name> <operator>/</operator> <name>i</name></expr></expr_stmt></block_content></block></if></if_stmt>
if i > 0:
    y = x / i
else
    x = i
    y = f( x )
<if_stmt><if>if <condition><expr><name>i</name> <operator>&gt;</operator> <literal type="number">0</literal></expr></condition><block>:<block_content>
    <expr_stmt><expr><name>y</name> <operator>=</operator> <name>x</name> <operator>/</operator> <name>i</name></expr></expr_stmt>
</block_content></block></if><else>else</else></if_stmt>
    <expr_stmt><expr><name>x</name> <operator>=</operator> <name>i</name></expr></expr_stmt>
    <expr_stmt><expr><name>y</name> <operator>=</operator> <call><name>f</name><argument_list>( <argument><expr><name>x</name></expr></argument> )</argument_list></call></expr></expr_stmt>
if i > 0:
    if j > i:
        x = j
    else:
        x = i
<if_stmt><if>if <condition><expr><name>i</name> <operator>&gt;</operator> <literal type="number">0</literal></expr></condition><block>:<block_content>
    <if_stmt><if>if <condition><expr><name>j</name> <operator>&gt;</operator> <name>i</name></expr></condition><block>:<block_content>
        <expr_stmt><expr><name>x</name> <operator>=</operator> <name>j</name></expr></expr_stmt>
</block_content></block></if>    <else>else<block>:<block_content>
        <expr_stmt><expr><name>x</name> <operator>=</operator> <name>i</name></expr></expr_stmt></block_content></block></else></if_stmt></block_content></block></if></if_stmt>
if i > 0:
    if j > i:
        x = j
else
    x = i
<if_stmt><if>if <condition><expr><name>i</name> <operator>&gt;</operator> <literal type="number">0</literal></expr></condition><block>:<block_content>
    <if_stmt><if>if <condition><expr><name>j</name> <operator>&gt;</operator> <name>i</name></expr></condition><block>:<block_content>
        <expr_stmt><expr><name>x</name> <operator>=</operator> <name>j</name></expr></expr_stmt>
</block_content></block></if></if_stmt></block_content></block></if><else>else</else></if_stmt>
    <expr_stmt><expr><name>x</name> <operator>=</operator> <name>i</name></expr></expr_stmt>
if i > 0:
 	x = i
elif i < 0:
	x = q
else:
    x = j
<if_stmt><if>if <condition><expr><name>i</name> <operator>&gt;</operator> <literal type="number">0</literal></expr></condition><block>:<block_content>
 	<expr_stmt><expr><name>x</name> <operator>=</operator> <name>i</name></expr></expr_stmt>
</block_content></block></if><if type="elseif">elif <condition><expr><name>i</name> <operator>&lt;</operator> <literal type="number">0</literal></expr></condition><block>:<block_content>
	<expr_stmt><expr><name>x</name> <operator>=</operator> <name>q</name></expr></expr_stmt>
</block_content></block></if><else>else<block>:<block_content>
    <expr_stmt><expr><name>x</name> <operator>=</operator> <name>j</name></expr></expr_stmt></block_content></block></else></if_stmt>

while statement


Element

  • <while>

Subelements

  • <condition>
  • <block>
  • <else>

XPath

srcQL

  • while loops

    //src:while
  • while-loop conditions

    //src:while/src:condition
  • while loops with a condition containing the variable i

    //src:while[src:condition//src:name='i']
  • find any while

    FIND while $E:

for statement


Element

  • <for>

Subelements

  • <control>
  • <block>
  • <specifier>
  • <else>

XPath

srcQL

  • for loops

    //src:for
  • for-loop initialization statements

    //src:for/src:control/src:init
  • for-loop conditions

    //src:for/src:control/src:condition
  • for-loop increments

    //src:for/src:control/src:incr
  • for loops that declare a variable with a single character name (e.g. x, i or y)

    //src:for[string-length(src:control/src:init/src:decl/src:name)=1]
  • for loops with post-increment in the increment expression

    //src:for[src:control/src:incr/src:expr//following-sibling::src:operator='++']
  • range-based for loops

    //src:for[src:control//src:range]
  • find any for-loop

    FIND for $E
  • find any “for” part in a comprehension

    FIND src:for WITHIN src:comprehension

Examples

for i in range(10):
    print(i)
    
<for>for <control><expr><name>i</name></expr> <range>in <expr><call><name>range</name><argument_list>(<argument><expr><literal type="number">10</literal></expr></argument>)</argument_list></call></expr></range></control><block>:<block_content>
    <expr_stmt><expr><call><name>print</name><argument_list>(<argument><expr><name>i</name></expr></argument>)</argument_list></call></expr></expr_stmt>
</block_content></block></for>    
for i in range(max):
    if line[i] == ' ':
        space += 1
    if line[i] == '\t':
        tab += 1

<for>for <control><expr><name>i</name></expr> <range>in <expr><call><name>range</name><argument_list>(<argument><expr><name>max</name></expr></argument>)</argument_list></call></expr></range></control><block>:<block_content>
    <if_stmt><if>if <condition><expr><name><name>line</name><index>[<expr><name>i</name></expr>]</index></name> <operator>==</operator> <literal type="string">' '</literal></expr></condition><block>:<block_content>
        <expr_stmt><expr><name>space</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></if></if_stmt>    <if_stmt><if>if <condition><expr><name><name>line</name><index>[<expr><name>i</name></expr>]</index></name> <operator>==</operator> <literal type="string">'\t'</literal></expr></condition><block>:<block_content>
        <expr_stmt><expr><name>tab</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></if></if_stmt></block_content></block></for>
for i in range(10):
    a += x[i]

<for>for <control><expr><name>i</name></expr> <range>in <expr><call><name>range</name><argument_list>(<argument><expr><literal type="number">10</literal></expr></argument>)</argument_list></call></expr></range></control><block>:<block_content>
    <expr_stmt><expr><name>a</name> <operator>+=</operator> <name><name>x</name><index>[<expr><name>i</name></expr>]</index></name></expr></expr_stmt>
</block_content></block></for>
for int(i) in v:
    print(f"{i} ")

<for>for <control><expr><call><name>int</name><argument_list>(<argument><expr><name>i</name></expr></argument>)</argument_list></call></expr> <range>in <expr><name>v</name></expr></range></control><block>:<block_content>
    <expr_stmt><expr><call><name>print</name><argument_list>(<argument><expr><literal type="string">f"{i} "</literal></expr></argument>)</argument_list></call></expr></expr_stmt>
</block_content></block></for>

Empty for statement

for p in v:
    pass

<for>for <control><expr><name>p</name></expr> <range>in <expr><name>v</name></expr></range></control><block>:<block_content>
    <pass>pass</pass>
</block_content></block></for>

break statement


Element

  • <break>

XPath

srcQL

  • break statements

    //src:break
  • break statements in for loops

    //src:for//src:break
  • for loops with break statements

    //src:for[.//src:break]
  • find break statements

    FIND break
  • find any for loops that contain a break statement

    FIND for $E: CONTAINS break

return statement


Element

  • <return>

Subelement

  • <expr>

XPath

srcQL

  • return statements

    //src:return
  • return expressions

    //src:return/src:expr
  • return statements that return true

    //src:return[src:expr='true']
  • functions with more then one return

    //src:function[count(.//src:return)>1]
  • find any return keywords

    FIND return
  • find any functions that contain a return keyword

    FIND def $N(): CONTAINS return

switch statement


Element

  • <switch>

Subelements

  • <condition>
  • <block>

XPath

srcQL

  • switch statements

    //src:switch
  • switch-statement conditions

    //src:switch/src:condition
  • find any match statement

    FIND match $E:

Examples

match c:

    case 'A':
        capa += 1
    case 'a':
        lettera += 1
    case _:
        total += 1

<switch>match <condition><expr><name>c</name></expr></condition><block>:<block_content>

    <case>case <expr><literal type="string">'A'</literal></expr><block>:<block_content>
        <expr_stmt><expr><name>capa</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></case>    <case>case <expr><literal type="string">'a'</literal></expr><block>:<block_content>
        <expr_stmt><expr><name>lettera</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></case>    <case>case <expr><name>_</name></expr><block>:<block_content>
        <expr_stmt><expr><name>total</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></case></block_content></block></switch>
match i:

    case -1:
        n += 1

    case 0:
        z += 1

    case 1:
        p += 1;

<switch>match <condition><expr><name>i</name></expr></condition><block>:<block_content>

    <case>case <expr><operator>-</operator><literal type="number">1</literal></expr><block>:<block_content>
        <expr_stmt><expr><name>n</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></case>
    <case>case <expr><literal type="number">0</literal></expr><block>:<block_content>
        <expr_stmt><expr><name>z</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></case>
    <case>case <expr><literal type="number">1</literal></expr><block>:<block_content>
        <expr_stmt><expr><name>p</name> <operator>+=</operator> <literal type="number">1</literal></expr>;</expr_stmt>
</block_content></block></case></block_content></block></switch>

case statement


Element

  • <case>

Subelements

  • <expr>
  • <block>
  • <alias>
  • <condition>

XPath

srcQL

  • case labels

    //src:case
  • case labels that use SATURDAY

    //src:case[.//src:name='SATURDAY']
  • switch statements with a case that uses SATURDAY

    //src:switch[src:block/src:block_content/src:case//src:name='SATURDAY']
  • find any case statements

    FIND case $E:
  • find any case statements with the wildcard operator (_)

    FIND case _:

block


Element

  • <block>

Subelement

  • <block_content>

XPath

srcQL

  • blocks

    //src:block
  • variable declarations in a block

    //src:block//src:decl_stmt
  • top-level variable declarations in a block

    //src:block/src:block_content/src:decl_stmt
  • find block

    FIND src:block

Examples

if A:
    B
elif A2:
    C
else:
    D
<if_stmt><if>if <condition><expr><name>A</name></expr></condition><block>:<block_content>
    <expr_stmt><expr><name>B</name></expr></expr_stmt>
</block_content></block></if><if type="elseif">elif <condition><expr><name>A2</name></expr></condition><block>:<block_content>
    <expr_stmt><expr><name>C</name></expr></expr_stmt>
</block_content></block></if><else>else<block>:<block_content>
    <expr_stmt><expr><name>D</name></expr></expr_stmt></block_content></block></else></if_stmt>
match c:

    case 'A':
        capa += 1
    case 'a':
        lettera += 1
    case _:
        total += 1

<switch>match <condition><expr><name>c</name></expr></condition><block>:<block_content>

    <case>case <expr><literal type="string">'A'</literal></expr><block>:<block_content>
        <expr_stmt><expr><name>capa</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></case>    <case>case <expr><literal type="string">'a'</literal></expr><block>:<block_content>
        <expr_stmt><expr><name>lettera</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></case>    <case>case <expr><name>_</name></expr><block>:<block_content>
        <expr_stmt><expr><name>total</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></case></block_content></block></switch>
for i in range(10):
    a += x[i]

<for>for <control><expr><name>i</name></expr> <range>in <expr><call><name>range</name><argument_list>(<argument><expr><literal type="number">10</literal></expr></argument>)</argument_list></call></expr></range></control><block>:<block_content>
    <expr_stmt><expr><name>a</name> <operator>+=</operator> <name><name>x</name><index>[<expr><name>i</name></expr>]</index></name></expr></expr_stmt>
</block_content></block></for>

expression statement


Element

  • <expr_stmt>

Subelement

  • <expr>

XPath

  • expression statements

    //src:expr_stmt

assert statement


Element

  • <assert>

Subelement

  • <condition>

XPath

srcQL

  • assert statements

    //src:assert
  • methods with assert statements

    //src:function[.//src:assert]
  • find all assert statements

    FIND assert $E

argument parameter


Element

  • <parameter type="args">

Subelements

  • <annotation>
  • <expr>

XPath

srcQL

  • arbitrary argument parameter

    //src:parameter[@type='args']
  • find any arbitrary argument parameter

    FIND src:parameter[@type="args"]

keyword argument parameter


Element

  • <parameter type="kwargs">

Subelements

  • <annotation>
  • <expr>

XPath

srcQL

  • keyword argument parameter

    //src:parameter[@type='kwargs']
  • find any keyword argument parameter

    FIND src:parameter[@type="kwargs"]

Example

def summary(**stats):
    print("SUMMARY")
    for key, value in stats.items():
        print("{}: {}".format(key,value))

summary(Name = "John Smith", Gender = "Male", Age = 23, Height = 68)
<function>def <name>summary</name><parameter_list>(<parameter type="kwargs">**<name>stats</name></parameter>)</parameter_list><block>:<block_content>
    <expr_stmt><expr><call><name>print</name><argument_list>(<argument><expr><literal type="string">"SUMMARY"</literal></expr></argument>)</argument_list></call></expr></expr_stmt>
    <for>for <control><expr><tuple><expr><name>key</name></expr>, <expr><name>value</name></expr></tuple></expr> <range>in <expr><call><name><name>stats</name><operator>.</operator><name>items</name></name><argument_list>()</argument_list></call></expr></range></control><block>:<block_content>
        <expr_stmt><expr><call><name>print</name><argument_list>(<argument><expr><literal type="string">"{}: {}"</literal><operator>.</operator><call><name>format</name><argument_list>(<argument><expr><name>key</name></expr></argument>,<argument><expr><name>value</name></expr></argument>)</argument_list></call></expr></argument>)</argument_list></call></expr></expr_stmt>
</block_content></block></for></block_content></block></function>
<expr_stmt><expr><call><name>summary</name><argument_list>(<argument><name>Name</name> = <expr><literal type="string">"John Smith"</literal></expr></argument>, <argument><name>Gender</name> = <expr><literal type="string">"Male"</literal></expr></argument>, <argument><name>Age</name> = <expr><literal type="number">23</literal></expr></argument>, <argument><name>Height</name> = <expr><literal type="number">68</literal></expr></argument>)</argument_list></call></expr></expr_stmt>

delete


Element

  • <delete>

Subelement

  • <name>

XPath

srcQL

  • delete

    //src:delete
  • find delete statement

    FIND del $N

execute statement


Element

  • <exec>

Subelement

  • <expr>

XPath

srcQL

  • execute statement

    //src:exec
  • find any Python 2 exec statements

    FIND exec $E

global statement


Element

  • <global>

Subelement

  • <name>

XPath

srcQL

  • global statement

    //src:global
  • find any global statement

    FIND global $N

import statement


Element

  • <import>

Subelements

  • <from>
  • <name>
  • <alias>

XPath

srcQL

  • import statement

    //src:import
  • find any import statement

    FIND import $N
  • find any “from … import …” statement

    FIND from $A import $B

Examples

import sys
<import>import <name>sys</name></import>
import numpy as np
<import>import <name>numpy</name> <alias>as <expr><name>np</name></expr></alias></import>
from pathlib import Path
<import><from>from <name>pathlib</name></from> import <name>Path</name></import>

pass statement


Element

  • <pass>

XPath

srcQL

  • pass statement

    //src:pass
  • find any pass keywords

    FIND pass
  • find any functions that contain a pass keyword

    FIND def $N(): CONTAINS pass

with statement


Element

  • <with>

Subelements

  • <specifier>
  • <alias>
  • <block>
  • <expr>

XPath

srcQL

  • with statement

    //src:with
  • find any with statement

    FIND with $E:
  • find any asynchrounous with statement

    FIND async with $E:

yield from statement


Element

  • <yield type="from">

Subelement

  • <expr>

XPath

srcQL

  • yield from statement

    //src:yield[@type='from']
  • find any yield from statement

    FIND yield from $E

condition


Element

  • <condition>

Subelement

  • <expr>

XPath

srcQL

  • conditions, including ternary conditions

    //src:condition
  • condition expressions

    //src:condition/src:expr
  • if conditions

    //src:if/src:condition
  • while conditions

    //src:while/src:condition
  • ternary conditions

    //src:ternary/src:condition
  • find any condition

    FIND src:condition
  • find any (optional) condition located in a comprehension

    FIND src:condition WITHIN src:comprehension

block content


Element

  • <block_content>

XPath

srcQL

  • block contents

    //src:block_content
  • declaration block_contents

    //src:decl/src:block/src:block_content
  • function block_contents

    //src:function/src:block/src:block_content
  • find block content

    FIND src:block_content

if


Element

  • <if>

Subelements

  • <condition>
  • <block>

XPath

srcQL

  • all ifs

    //src:if
  • find any if keyword

    FIND src:if
  • find any if keywords that are part of a ternary

    FIND srcif WITHIN src:ternary

else


Element

  • <else>

Subelement

  • <block>

XPath

srcQL

  • all elses

    //src:else
  • find any else keyword

    FIND src:else
  • find any else keywords that are part of a ternary

    FIND src:else WITHIN src:ternary

control


Element

  • <control>

Subelements

  • <init>
  • <condition>

XPath

srcQL

  • initialization and condition of for loops

    //src:control
  • find any code located after a “for” keyword yet before the start of the block (i.e, the “control” parts)

    FIND src:control
  • find any “control” parts in for-loops

    FIND src:control WITHIN for $E:
  • find any “control” parts in list comprehension

    src:control WITHIN [$A for $B in $C]

annotation


Element

  • <annotation>

XPath

srcQL

  • annotation

    //src:annotation
  • find all annotated parameters

    FIND src:parameter CONTAINS src:annotation
  • find all function type annotations

    FIND def $N() -> $E

expr


Element

  • <expr>

XPath

srcQL

  • expr

    //src:expr
  • find any expression

    FIND src:expr

super class


Element

  • <super>

XPath

srcQL

  • super class

    //src:super
  • find any super class

    FIND src:super

async specifier


Element

  • <specifier>async</specifier>

XPath

srcQL

  • async specifier

    //src:name[src:name/src:specifier='async']
  • find any async specifier

    FIND src:specifier
  • find any asynchronous function

    FIND async def $N():
  • find any asynchronous for-loop

    FIND async for $E():

Example

async used as a specifier

async def ExampleMethodAsync():
<function><specifier>async</specifier> def <name>ExampleMethodAsync</name><parameter_list>()</parameter_list><block>:<block_content/></block></function>

function


Element

  • <function>

Subelements

  • <annotation>
  • <name>
  • <parameter_list>
  • <parameter_list type="generic">
  • <block>
  • <attribute>
  • <specifier>

XPath

srcQL

  • function definitions

    //src:function
  • find any function

    FIND def $N():
  • find any asynchronous function

    FIND async def $N():
  • find any generic function (Python 3.12 syntax)

    FIND def $N[]():

Examples

def function(foo):
<function>def <name>function</name><parameter_list>(<parameter><name>foo</name></parameter>)</parameter_list><block>:<block_content/></block></function>
def function(foo: int, bar: str):
<function>def <name>function</name><parameter_list>(<parameter><name>foo</name><annotation>: <expr><name>int</name></expr></annotation></parameter>, <parameter><name>bar</name><annotation>: <expr><name>str</name></expr></annotation></parameter>)</parameter_list><block>:<block_content/></block></function>
def function(*collection):
    for arg in collection:
        print(arg)
<function>def <name>function</name><parameter_list>(<parameter type="args">*<name>collection</name></parameter>)</parameter_list><block>:<block_content>
    <for>for <control><expr><name>arg</name></expr> <range>in <expr><name>collection</name></expr></range></control><block>:<block_content>
        <expr_stmt><expr><call><name>print</name><argument_list>(<argument><expr><name>arg</name></expr></argument>)</argument_list></call></expr></expr_stmt></block_content></block></for></block_content></block></function>
def summary(**stats):
    print("SUMMARY")
    for key, value in stats.items():
        print("{}: {}".format(key,value))

summary(Name = "John Smith", Gender = "Male", Age = 23, Height = 68)
<function>def <name>summary</name><parameter_list>(<parameter type="kwargs">**<name>stats</name></parameter>)</parameter_list><block>:<block_content>
    <expr_stmt><expr><call><name>print</name><argument_list>(<argument><expr><literal type="string">"SUMMARY"</literal></expr></argument>)</argument_list></call></expr></expr_stmt>
    <for>for <control><expr><tuple><expr><name>key</name></expr>, <expr><name>value</name></expr></tuple></expr> <range>in <expr><call><name><name>stats</name><operator>.</operator><name>items</name></name><argument_list>()</argument_list></call></expr></range></control><block>:<block_content>
        <expr_stmt><expr><call><name>print</name><argument_list>(<argument><expr><literal type="string">"{}: {}"</literal><operator>.</operator><call><name>format</name><argument_list>(<argument><expr><name>key</name></expr></argument>,<argument><expr><name>value</name></expr></argument>)</argument_list></call></expr></argument>)</argument_list></call></expr></expr_stmt>
</block_content></block></for></block_content></block></function>
<expr_stmt><expr><call><name>summary</name><argument_list>(<argument><name>Name</name> = <expr><literal type="string">"John Smith"</literal></expr></argument>, <argument><name>Gender</name> = <expr><literal type="string">"Male"</literal></expr></argument>, <argument><name>Age</name> = <expr><literal type="number">23</literal></expr></argument>, <argument><name>Height</name> = <expr><literal type="number">68</literal></expr></argument>)</argument_list></call></expr></expr_stmt>

lambda functions


Element

  • <lambda>

Subelements

  • <parameter>
  • <expr>

XPath

srcQL

  • lambda functions

    //src:lambda
  • lambda functions without a specified return type

    //src:lambda[not(src:type)]
  • lambdas which have a the return type of int

    //src:lambda[src:type/src:name'int']
  • find any lambda function

    FIND src:lambda

typedef


Element

  • <typedef>

Subelements

  • <name>
  • <expr>

XPath

srcQL

  • typedefs

    //src:typedef
  • types in typedefs

    //src:typedef/src:type
  • typedef names

    //src:typedef/src:name
  • typedefs that define a struct

    //src:typedef[src:type/src:struct]
  • typedefs that declare a function type

    //src:typedef[src:function_decl]
  • typedefs of function pointers

    //src:typedef[contains(src:function_decl,')')]
  • names of typedefs of function pointers

    //src:typedef/src:function_decl[contains(.,')')]/src:name
  • find any Python 3.12 type aliases

    FIND type $N = $E
  • find any Python 3.12 generic type aliases

    FIND type $N[] = $E

declaration initialization


Element

  • <init>

XPath

srcQL

  • initialization

    //src:init
  • array declarations with an initialization

    //src:decl[src:name/src:index][src:init]
  • function declarations with default parameters

    //src:function_decl[src:parameter_list/src:parameter/src:decl/src:init]
  • find any initialization

    FIND src:init
  • find any initialization in a parameter list

    FIND src:init WITHIN src:parameter_list

range


Element

  • <range>

Subelement

  • <expr>

XPath

srcQL

  • loop ranges

    //src:decl[src:range]
  • find any code located included after an “in” keyword in a for-loop before the start of the block (i.e., the “range” parts)

    FIND src:range
  • find any “range” parts in for-loops

    FIND src:range WITHIN for $E:
  • find any “range” parts in list comprehensions

    FIND src:range WITHIN [$A for $B in $C]

Examples

for i in range(max):
    if line[i] == ' ':
        space += 1
    if line[i] == '\t':
        tab += 1

<for>for <control><expr><name>i</name></expr> <range>in <expr><call><name>range</name><argument_list>(<argument><expr><name>max</name></expr></argument>)</argument_list></call></expr></range></control><block>:<block_content>
    <if_stmt><if>if <condition><expr><name><name>line</name><index>[<expr><name>i</name></expr>]</index></name> <operator>==</operator> <literal type="string">' '</literal></expr></condition><block>:<block_content>
        <expr_stmt><expr><name>space</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></if></if_stmt>    <if_stmt><if>if <condition><expr><name><name>line</name><index>[<expr><name>i</name></expr>]</index></name> <operator>==</operator> <literal type="string">'\t'</literal></expr></condition><block>:<block_content>
        <expr_stmt><expr><name>tab</name> <operator>+=</operator> <literal type="number">1</literal></expr></expr_stmt>
</block_content></block></if></if_stmt></block_content></block></for>
for i in range(10):
    a += x[i]

<for>for <control><expr><name>i</name></expr> <range>in <expr><call><name>range</name><argument_list>(<argument><expr><literal type="number">10</literal></expr></argument>)</argument_list></call></expr></range></control><block>:<block_content>
    <expr_stmt><expr><name>a</name> <operator>+=</operator> <name><name>x</name><index>[<expr><name>i</name></expr>]</index></name></expr></expr_stmt>
</block_content></block></for>

class definition


Element

  • <class>

Subelements

  • <name>
  • <attribute>
  • <super_list>
  • <parameter_list type="generic">
  • <block>

XPath

srcQL

  • class definitions

    //src:class
  • classes with the name foo

    //src:class[src:name='foo']
  • function definitions in classes

    //src:class//src:function
  • function declarations in classes

    //src:class//src:function_decl
  • find any class:

    FIND class $N
  • find any generic class (Python 3.12 syntax):

    FIND class $N[]

Examples

class Foo:
    pass
<class>class <name>Foo</name><block>:<block_content>
    <pass>pass</pass></block_content></block></class>
class Foo(bar):
    pass
<class>class <name>Foo</name><super_list>(<super><expr><name>bar</name></expr></super>)</super_list><block>:<block_content>
    <pass>pass</pass></block_content></block></class>
class Foo:
	def __init__(self):
		pass
<class>class <name>Foo</name><block>:<block_content>
	<function>def <name>__init__</name><parameter_list>(<parameter><name>self</name></parameter>)</parameter_list><block>:<block_content>
		<pass>pass</pass></block_content></block></function></block_content></block></class>
class Foo:
	def foo():
		pass
<class>class <name>Foo</name><block>:<block_content>
	<function>def <name>foo</name><parameter_list>()</parameter_list><block>:<block_content>
		<pass>pass</pass></block_content></block></function></block_content></block></class>
class Foo:
	def __del__(self):
		pass
<class>class <name>Foo</name><block>:<block_content>
	<function>def <name>__del__</name><parameter_list>(<parameter><name>self</name></parameter>)</parameter_list><block>:<block_content>
		<pass>pass</pass></block_content></block></function></block_content></block></class>
class Foo:
	def __init__(self, bar):
		self.bar = bar
	def __del__(self):
		del self.bar
<class>class <name>Foo</name><block>:<block_content>
	<function>def <name>__init__</name><parameter_list>(<parameter><name>self</name></parameter>, <parameter><name>bar</name></parameter>)</parameter_list><block>:<block_content>
		<expr_stmt><expr><name><name>self</name><operator>.</operator><name>bar</name></name> <operator>=</operator> <name>bar</name></expr></expr_stmt>
</block_content></block></function>	<function>def <name>__del__</name><parameter_list>(<parameter><name>self</name></parameter>)</parameter_list><block>:<block_content>
		<delete>del <name><name>self</name><operator>.</operator><name>bar</name></name></delete></block_content></block></function></block_content></block></class>

inheritance list


Element

  • <super_list>

Subelements

  • <super>
  • <expr>

XPath

srcQL

  • classes with at least one super class

    //src:class[src:super]
  • classes that inherit from bar

    //src:class[src:super/src:name='bar']
  • find any “super” list

    FIND src:super_list
  • find any classes that contain a super list

    FIND class $N():

ternary operator


Element

  • <ternary>

Subelements

  • <condition>
  • <else>

XPath

srcQL

  • ternary operators

    //src:ternary
  • find any ternary

    FIND src:ternary

argument


Element

  • <argument>

Subelements

  • <name>
  • <expr>

XPath

srcQL

  • argument

    //src:argument
  • find any argument in a function call

    FIND src:argument
  • find any arguments that unpack iterables (lists, tuples, sets, etc.)

    FIND src:argument CONTAINS *
  • find any arguments that unpack dictionaries

    FIND src:argument CONTAINS **
  • find any function calls that contain at least one named argument

    FIND $C($N = $E)

argument list


Element

  • <argument_list>

Subelement

  • <argument>

XPath

srcQL

  • argument list

    //src:argument_list
  • find a list of arguments

    FIND src:argument_list

list


Element

  • <array>

Subelements

  • <expr>
  • <comprehension>

XPath

srcQL

  • array

    //src:array
  • find any list

    FIND src:array
  • find any list comprehension

    FIND [$A for $B in $C]

Examples

A : list[str] = []
<expr_stmt><expr><name>A</name> <annotation>: <expr><name><name>list</name><index>[<expr><name>str</name></expr>]</index></name></expr></annotation> <operator>=</operator> <array>[]</array></expr></expr_stmt>
matrix : list[float] = [[None for _ in range(15)] for _ in range(10)]
<expr_stmt><expr><name>matrix</name> <annotation>: <expr><name><name>list</name><index>[<expr><name>float</name></expr>]</index></name></expr></annotation> <operator>=</operator> <array>[<expr><array>[<expr><literal type="null">None</literal></expr> <comprehension><for>for <control><expr><name>_</name></expr> <range>in <expr><call><name>range</name><argument_list>(<argument><expr><literal type="number">15</literal></expr></argument>)</argument_list></call></expr></range></control></for></comprehension>]</array></expr> <comprehension><for>for <control><expr><name>_</name></expr> <range>in <expr><call><name>range</name><argument_list>(<argument><expr><literal type="number">10</literal></expr></argument>)</argument_list></call></expr></range></control></for></comprehension>]</array></expr></expr_stmt>
class pair:
  x : float = None
  y : float = None

complex : list[pair] = [pair() for entry in range(100)]
<class>class <name>pair</name><block>:<block_content>
  <expr_stmt><expr><name>x</name> <annotation>: <expr><name>float</name></expr></annotation> <operator>=</operator> <literal type="null">None</literal></expr></expr_stmt>
  <expr_stmt><expr><name>y</name> <annotation>: <expr><name>float</name></expr></annotation> <operator>=</operator> <literal type="null">None</literal></expr></expr_stmt>
</block_content></block></class>
<expr_stmt><expr><name>complex</name> <annotation>: <expr><name><name>list</name><index>[<expr><name>pair</name></expr>]</index></name></expr></annotation> <operator>=</operator> <array>[<expr><call><name>pair</name><argument_list>()</argument_list></call></expr> <comprehension><for>for <control><expr><name>entry</name></expr> <range>in <expr><call><name>range</name><argument_list>(<argument><expr><literal type="number">100</literal></expr></argument>)</argument_list></call></expr></range></control></for></comprehension>]</array></expr></expr_stmt>

comprehension


Element

  • <comprehension>

Subelements

  • <for>
  • <specifier>
  • <control>
  • <range>
  • <if>

XPath

srcQL

  • comprehension

    //src:comprehension
  • find any comprehension

    FIND src:comprehension
  • find any list comprehension

    FIND [$A for $B in $C]
  • find any set comprehension

    FIND {$A for $B in $C}
  • find any dictionary comprehension

    FIND {$A: $B for $C in $D}

dictionary


Element

  • <dictionary>

Subelements

  • <expr>
  • <comprehension>

XPath

srcQL

  • dictionary

    //src:dictionary
  • find any dictionary

    FIND src:dictionary
  • find any expression containing a dictionary

    FIND {}
  • find any expresison containing a dictionary comprehension

    FIND {$A: $B for $C in $D}

index


Element

  • <index>

Subelement

  • <expr>

XPath

  • index

    //src:index

tuple


Element

  • <tuple>

Subelements

  • <expr>

XPath

srcQL

  • tuple

    //src:tuple
  • find any tuple (with or without parenthesis)

    FIND src:tuple
  • find any expression containing a tuple

    FIND ()
  • find any expression containing a tuple with at least two items

    FIND ($A, $B)

operator


Element

  • <operator>

XPath

srcQL

  • operator

    //src:operator
  • find any operator

    FIND src:operator
  • find any expression with a plus sign (+)

    FIND +

attribute


Element

  • <attribute>

Subelement

  • <expr>

XPath

srcQL

  • attributes

    //src:attribute
  • noreturn functions

    //src:function[src:attribute/src:expr/src:name='noreturn']
  • find any attribute

    FIND src:attribute
  • find all functions with at least one attribute

    FIND @$E def $N():

parameter list


Element

  • <parameter_list>

Subelement

  • <parameter>

XPath

srcQL

  • parameter list

    //src:parameter_list
  • find any parameter list

    FIND src:parameter_list

Examples

def function(foo):
<function>def <name>function</name><parameter_list>(<parameter><name>foo</name></parameter>)</parameter_list><block>:<block_content/></block></function>
def function(*collection):
    for arg in collection:
        print(arg)
<function>def <name>function</name><parameter_list>(<parameter type="args">*<name>collection</name></parameter>)</parameter_list><block>:<block_content>
    <for>for <control><expr><name>arg</name></expr> <range>in <expr><name>collection</name></expr></range></control><block>:<block_content>
        <expr_stmt><expr><call><name>print</name><argument_list>(<argument><expr><name>arg</name></expr></argument>)</argument_list></call></expr></expr_stmt></block_content></block></for></block_content></block></function>
def func1():
  a = 1
  def func2():
    nonlocal a
    a = 2
  func2()
  return a

print(func1())
<function>def <name>func1</name><parameter_list>()</parameter_list><block>:<block_content>
  <expr_stmt><expr><name>a</name> <operator>=</operator> <literal type="number">1</literal></expr></expr_stmt>
  <function>def <name>func2</name><parameter_list>()</parameter_list><block>:<block_content>
    <nonlocal>nonlocal <name>a</name></nonlocal>
    <expr_stmt><expr><name>a</name> <operator>=</operator> <literal type="number">2</literal></expr></expr_stmt>
</block_content></block></function>  <expr_stmt><expr><call><name>func2</name><argument_list>()</argument_list></call></expr></expr_stmt>
  <return>return <expr><name>a</name></expr></return>
</block_content></block></function>
<expr_stmt><expr><call><name>print</name><argument_list>(<argument><expr><call><name>func1</name><argument_list>()</argument_list></call></expr></argument>)</argument_list></call></expr></expr_stmt>

generic property


Element

  • <parameter_list type="generic">

Subelement

  • <parameter>

XPath

srcQL

  • generic parameter list

    //src:parameter_list[@type='generic']
  • find any generic parameter list

    FIND src:parameter_list[@type="generic"]

throw


Element

  • <throw>

Subelements

  • <expr>
  • <from>

XPath

srcQL

  • uses of throw

    //src:throw
  • find any raise statement

    FIND src:throw
  • find any “raise … from” statement

    FIND raise $A from $B

except statement


Element

  • <catch>

Subelements

  • <alias>
  • <expr>
  • <block>
  • <name>

XPath

srcQL

  • catch blocks

    //src:catch
  • find any except statement

    FIND src:catch
  • find any except statements

    FIND except
  • find any except statements that use Python 2 alternate aliasing syntax

    FIND except $E, $N: