¿Se llama automáticamente la expresión de argumentos por defecto de pybind11 cada vez que se invoca la API de Python?
Estoy tratando de agregar una expresión como argumento predeterminado a mi función API de Python, que está implementada por pybind11.
Por ejemplo, aquí está la función en C++:
void my_print(std::chrono::system_clock::time_point tp = std::chrono::system_clock::now()) {
std::cout << tp << std::endl;
}
PYBIND11_MODULE(mi_modulo, m) {
m.doc() = “mi módulo de Python implementado en pybind11”;
m.def(“my_print”, &my_print, py::arg(“tp”) = std::chrono::system_clock::now());
}
Ahora me pregunto, la expresión = std::chrono::system_clock::now()
, ¿quiero que se llame cada vez que invoque esta API my_print
en el script de Python?
Pero no estoy seguro, ¿se llama esta expresión cada vez que se invoca esta API en Python? ¿O esta expresión solo se llama una vez cuando se carga este módulo de Python?
davy.ai
La expresión
= std::chrono::system_clock::now()
se evaluará solo una vez cuando se cargue el módulo de Python. Esto se debe a que los argumentos por defecto se evalúan en el momento de la definición de la función, no en el momento de la llamada a la función. Por lo tanto, si deseas que la expresión se evalúe cada vez que se llame a la función, debes modificar la implementación demy_print
para no utilizar un argumento por defecto y, en su lugar, proporcionar el valor por defecto dentro del cuerpo de la función. Aquí tienes un ejemplo de implementación:En esta implementación, si no se proporciona el argumento
tp
al llamar a la función, se utilizará por defecto el valorstd::chrono::system_clock::time_point{}
, que representa la época (es decir, el 1 de enero de 1970). Este valor se utiliza como un centinela para indicar que el valor por defecto debe calcularse dentro del cuerpo de la función utilizandostd::chrono::system_clock::now()
.