es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , ,

Answer

  1. Avatar for 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 de my_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:

    void my_print(std::chrono::system_clock::time_point tp) {
      if (tp == std::chrono::system_clock::time_point{}) {
        tp = std::chrono::system_clock::now();
      }
      std::cout << tp << std::endl;
    }
    
    PYBIND11_MODULE(my_module, m) {
      m.doc() = "mi módulo de Python implementado en pybind11";
      m.def("my_print", &my_print, py::arg("tp") = std::chrono::system_clock::time_point{});
    }
    

    En esta implementación, si no se proporciona el argumento tp al llamar a la función, se utilizará por defecto el valor std::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 utilizando std::chrono::system_clock::now().

Comments are closed.