“relay.Expr with function type” in the comment on the python side means the op field can be expressions such as relay.Function, relay.GlobalVar, relay.Var as long as they are of type FunctionType, which refer to functions.
The Op class is a RelayExpr, it’s an expression (IR node) used to refer to a built-in Relay operator such as conv2d or relu. “op” in CallNode is a field name representing the callee of the CallNode, it’s of type RelayExpr (note that Op class is a subclass of RelayExpr). So this field can be an Op (representing calling a built-in operator in this context), or other expressions such as relay.Function, relay.GlobalVar, relay.Var.