AttributeError: '_RestrictData' object has no attribute 'filepath'
This is a side effect of the way you import.

from bpy import data as bpy_data imports the bpy_struct data when the py file is loaded, like a local copy (not alias). This happens during the addon registration, thus bpy_data will be and remain as:

&lt;class 'bpy_restrict_state._RestrictData'&gt;


In contrast, import bpy and a later use of bpy.data accesses data in the moment you actually use it. It is _RestrictData at registration time, but later on it will be

&lt;class 'bpy.types.BlendData'&gt;


You should change your imports from 

from bpy import ( data as bpy_data,
                  context as bpy_context )
from bpy.app.handlers import ( persistent as bpy_app_handlers_persistent,
                               save_post as bpy_app_handlers_save_post )
# ...


to

import bpy
from bpy.app.handlers import persistent

# ...

@persistent    
def foobar(scene):
    bpy.data.filepath
    #bpy.context...

# ...

bpy.app.handlers.save_post.append(foobar)


from ... import ... as ... should only be used if the imported module or function would overwrite another.