diff --git a/bindings/pyroot/src/TemplateProxy.cxx b/bindings/pyroot/src/TemplateProxy.cxx
index 5b841a0bc018e81326fde5b1252cc485b46cbc2a..0f49f6299e29f0ed696d74eea17141a56d05e324 100644
--- a/bindings/pyroot/src/TemplateProxy.cxx
+++ b/bindings/pyroot/src/TemplateProxy.cxx
@@ -286,7 +286,7 @@ namespace {
 
     // case 4a: instantiating obj->method< T0, T1, ... >( type(a0), type(a1), ... )( a0, a1, ... )
       if ( ! isType && ! ( nStrings == nArgs ) ) {    // no types among args and not all strings
-         PyObject* pyname_v2 = Utility::BuildTemplateName( NULL, tpArgs, 0 );
+         PyObject* pyname_v2 = Utility::BuildTemplateName( NULL, tpArgs, 0, true );
          if ( pyname_v2 ) {
             std::string mname = PyROOT_PyUnicode_AsString( pyname_v2 );
             Py_DECREF( pyname_v2 );
diff --git a/bindings/pyroot/src/Utility.cxx b/bindings/pyroot/src/Utility.cxx
index f909f3d537718bdcead844f1fe8fd00020c727bf..0e91f36a8fb74e8a5172a5447b6778e87633906f 100644
--- a/bindings/pyroot/src/Utility.cxx
+++ b/bindings/pyroot/src/Utility.cxx
@@ -459,7 +459,7 @@ Bool_t PyROOT::Utility::AddBinaryOperator( PyObject* pyclass, const std::string&
 /// for a class as in MakeRootTemplateClass in RootModule.cxx) or for method lookup
 /// (as in TemplatedMemberHook, below).
 
-PyObject* PyROOT::Utility::BuildTemplateName( PyObject* pyname, PyObject* args, int argoff )
+PyObject* PyROOT::Utility::BuildTemplateName( PyObject* pyname, PyObject* args, int argoff, bool inferredTypes )
 {
    if ( pyname )
       pyname = PyROOT_PyUnicode_FromString( PyROOT_PyUnicode_AsString( pyname ) );
@@ -482,10 +482,16 @@ PyObject* PyROOT::Utility::BuildTemplateName( PyObject* pyname, PyObject* args,
             tpName = PyObject_GetAttr( tn, PyStrings::gName );
          }
          // special case for strings
-         if ( strcmp( PyROOT_PyUnicode_AsString( tpName ), "str" ) == 0 ) {
+         auto tpNameStr = PyROOT_PyUnicode_AsString(tpName);
+         if ( strcmp( tpNameStr, "str" ) == 0 ) {
             Py_DECREF( tpName );
             tpName = PyROOT_PyUnicode_FromString( "std::string" );
          }
+         // and Python float (should be double in C++) if types have been inferred
+         else if (inferredTypes && strcmp(tpNameStr, "float") == 0) {
+            Py_DECREF(tpName);
+            tpName = PyROOT_PyUnicode_FromString("double");
+         }
          PyROOT_PyUnicode_AppendAndDel( &pyname, tpName );
       } else if ( PyInt_Check( tn ) || PyLong_Check( tn ) || PyFloat_Check( tn ) ) {
          // last ditch attempt, works for things like int values; since this is a
diff --git a/bindings/pyroot/src/Utility.h b/bindings/pyroot/src/Utility.h
index 255aadcaa975b631918402449eeb986f09f7ce5f..c929611dca6ff6ce34010f543a29eb2850a0f44f 100644
--- a/bindings/pyroot/src/Utility.h
+++ b/bindings/pyroot/src/Utility.h
@@ -40,7 +40,7 @@ namespace PyROOT {
          const char* op, const char* label, const char* alt_label = NULL );
 
    // helper for template classes and methods
-      PyObject* BuildTemplateName( PyObject* pyname, PyObject* args, int argoff );
+      PyObject* BuildTemplateName( PyObject* pyname, PyObject* args, int argoff, bool inferredTypes = false );
 
    // initialize proxy type objects
       Bool_t InitProxy( PyObject* module, PyTypeObject* pytype, const char* name );