refactor common functionality into data.core
add python data descriptor