In my python script I do something similar to: bpy.data.meshes['Triangle'].normals_split_custom_set_from_vertices([(0,1,0), (0,0,1), (1,0,0)])
I found that if I run this script in edit mode, shading will not update. If I run the script in object mode and then switch to edit mode - shading will use custom normals and viewport will show the right picture. I think that right behaviour is immediate shading update after this script execution.
There is another feature/bug that worked before and was changed/broken since blender 2.73.
C.active_object.data.vertices.normal = (0,0,1)
Alexander (Blend4Web Team)