You can attach certain attributes to your value specifications to change their behavior.
Currently, the only recognized attributes are
You can use them to bind a Python method names and argument names to something else on the OCaml side.
For example, rather than having a
Cat.__init__ method to call from the OCaml side (i.e., to make a new Python
Cat object), you can bind the Python
__init__ function to something more idiomatic like
create or whatever you want.
val create : t -> ... [@@py_fun_name __init__]
Another common use for this is to bind the Python
__str__ method for a class to
to_string on the OCaml side.
You can do this with any function. One reason is that you may want to have some type safety with a polymorphic Python function. While you could pass in Py.Object.t directly, you could also use attributes to bind multiple OCaml functions to the same Python method. E.g.,
val eat : t -> num_mice:int -> unit -> unit val eat_part : t -> num_mice:float -> unit -> unit [@@py_fun_name eat]
In this case, we have one
eat function for
int and one for
For a full working example see the attributes example on GitHub.
The linked example also shows how to use
- If you specify the
py_fun_namemore than once, it will do something wonky. Eventually, the program will treat this as an error, but for now, it is on you to avoid doing it.
- Attributes have to start a line. I.e., if you have more than one attribute, you can't put them on the same line. They must go on separate lines.