for "changing materials" I might use a mix shader in a single material and key the Factor between 0 and 1, with animation. As you'll see in the screencap, the factor is in color showing that it was animated (by the following script)

It's important to notice that when you add Mix Shaders, they are not referenced by the (re)name you give them but appear to be "Mix Shader", "Mix Shader.001", "Mix Shader.002" and so on.
Per @MarkusvonBroady's comment below, you can also use Node Groups to mix "Material Outputs", to better organize what could become an unwieldly number of nodes in a single Material definition. Here is the
file.
for node in bpy.data.materials["MyMatl with mixer"].node_tree.nodes:
print(node)
bpy.data.materials["Material.003"].node_tree.nodes["Mix Shader.001"].inputs[0].default_value = 0
bpy.data.materials["Material.003"].node_tree.nodes["Mix Shader.001"].inputs[0].keyframe_insert('default_value', frame=1)
bpy.data.materials["Material.003"].node_tree.nodes["Mix Shader.001"].inputs[0].keyframe_insert('default_value', frame=49)
bpy.data.materials["Material.003"].node_tree.nodes["Mix Shader.001"].inputs[0].default_value = 1
bpy.data.materials["Material.003"].node_tree.nodes["Mix Shader.001"].inputs[0].keyframe_insert('default_value', frame=50)
bpy.data.materials["Material1"].node_tree.nodes["Mix Shader"].inputs[0].default_value = 0. How to set the "key" for these changes... uhm... – james_t Apr 07 '21 at 19:17