
Reiz.io - это поисковая система структурного исходного кода для Python. По сравнению с популярными альтернативами (например, поиск кода GitHub) он выполняет запросы по синтаксическим деревьям (вместо кода необработанного исходного кода) и пытается перестать структурные знания (не применяется семантика). Для получения дополнительной информации см. Документы.
REIZ - это структура поиска кода, на которой REIZ.IO создана на вершине. Из -за своей природы он работает исключительно с AST и намеренно избегает выполнения какой -либо семантической работы.
Some ASTs attach a bit of contextual knowledge (e.g `Name(ctx=...)`
on python) which can be queried through simple matcher queries but
reiz.io doesn't include them when comparing references (see
matchers#reference-matcher for details).
Вот простой запрос REIZQL, который ищет функцию, которая заканчивается оператором TRY, где мы возвращаем вызов к функции, которая имеет то же имя, что и функция, которую мы находимся.
FunctionDef ( ~ func , body = [ * ..., Try ( body = [ Return ( Call ( Name ( ~ func )))])])который будет соответствовать следующему;
def foo ( spam ):
eggs = bar ()
try :
return foo ( spam + eggs )
except ValueError :
return NoneВ самом основном смысле он генерирует AST кода выше и проверяет, соответствует ли он шаблону (reizql Query) или нет.;
FunctionDef (
name = 'foo' ,
args = arguments (
posonlyargs = [],
args = [ arg ( arg = 'spam' , annotation = None , type_comment = None )],
vararg = None ,
kwonlyargs = [],
kw_defaults = [],
kwarg = None ,
defaults = [],
),
body = [
Assign (
targets = [ Name ( id = 'eggs' , ctx = Store ())],
value = Call (
func = Name ( id = 'bar' , ctx = Load ()),
args = [],
keywords = [],
),
type_comment = None ,
),
Try (
body = [
Return (
value = Call (
func = Name ( id = 'foo' , ctx = Load ()),
args = [
BinOp (
left = Name ( id = 'spam' , ctx = Load ()),
op = Add (),
right = Name ( id = 'eggs' , ctx = Load ()),
),
],
keywords = [],
),
),
],
handlers = [
ExceptHandler (
type = Name ( id = 'ValueError' , ctx = Load ()),
name = None ,
body = [
Return (
value = Constant ( value = None , kind = None ),
),
],
),
],
orelse = [],
finalbody = [],
),
],
decorator_list = [],
returns = None ,
type_comment = None ,
)