Python::attach(|py| {
    {{ call }}
{% if is_named %}
        .and_then(|v| v.extract::<String>())
        .and_then(|s| serde_json::from_str::<{{ extract_ty }}>(&s).map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string())))
{% else %}
        .and_then(|v| v.extract::<{{ extract_ty }}>())
{% endif %}
{% if has_error %}
        .map_err(|e| {{ error_expr }})
{% else %}
        .unwrap_or_default()
{% endif %}
})
