Search code examples
python-3.xtype-hintingpybind11python-3.10function-signature

Function Signatures/Interfaces from Pybind11 Module (IDE Suggestions)


Let's assume we have a simple module called _sample built with pybind11:

/* py_bindings.cpp */
#include <pybind11/pybind11.h>

namespace py = pybind11;

PYBIND11_MODULE(_sample, m) {
    m.def("add", [](int a, int b) { return a + b; });
    m.def("add", [](const std::string& lhs, const std::string& rhs) { return lhs + rhs; });
}

This produces a dynamic module file _sample.pyd (Windows) or _sample.so (Linux), which we can then import in the actual module sample:

## sample\__init__.py ##
from ._sample import *

So that we can write:

## script.py ##
import sample as s

print(s.add(4, 2))       # 6
print(s.add('AB', 'C'))  # ABC

The above code works fine, but the IDE does not know which functions are included in _sample until the code is actually run. And as a result, there are no function suggestions at all (and no function signature suggestions either).

enter image description here

As I would like to help the users of my library, my question is: how do I include function suggestions (or "function hints") in my module?

I've tried including the below code in sample\__init__.py as I thought the ... might work as a "hint". But unfortunately, this overrides the original add function from _sample.

def add(arg0: int, arg1: int) -> int:
    ...

Are there ways to hint the function signatures to a Python IDE?

Of course, I want to extend this to classes, class functions & module attributes too. I just picked functions as a starting point.


Solution

  • I think what you're looking for is a stub or interface (pyi) file. The IDE can understand the signature of functions and classes from this file. If you're using pybind11, check out pybind11-stubgen for automatic generation of a stub file.