typedesc.cpp 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "typedesc.h"
  2. #include <util/generic/singleton.h>
  3. static void RegisterJSONBridgeImpl() {
  4. PyRun_SimpleString("import json\n"
  5. "class PyBindEncoder(json.JSONEncoder):\n"
  6. " def default(self, obj):\n"
  7. " if isinstance(obj, bytes):\n"
  8. " try:\n"
  9. " return obj.decode()\n"
  10. " except UnicodeDecodeError:\n"
  11. " return obj.hex()\n"
  12. " dct = None\n"
  13. " if hasattr(obj, '__getstate__'):\n"
  14. " dct = obj.__getstate__()\n"
  15. " elif hasattr(obj, '__dict__'):\n"
  16. " dct = obj.__dict__\n"
  17. " if dct is None:\n"
  18. " return json.JSONEncoder.default(self, obj)\n"
  19. " if hasattr(obj, '__class__'):\n"
  20. " if hasattr(obj.__class__, '__name__'):\n"
  21. " dct['__name__'] = obj.__class__.__name__\n"
  22. " if hasattr(obj.__class__, '__module__'):\n"
  23. " dct['__module__'] = obj.__class__.__module__\n"
  24. " if hasattr(obj, 'GetPropertiesNames'):\n"
  25. " dct['__properties__'] = obj.GetPropertiesNames()\n"
  26. " return dct");
  27. PyRun_SimpleString("def PyBindObjectHook(dct):\n"
  28. " if '__name__' in dct:\n"
  29. " name = dct['__name__']\n"
  30. " module = dct['__module__']\n"
  31. " del dct['__name__']\n"
  32. " del dct['__module__']\n"
  33. " cls = getattr(__import__(module), name)\n"
  34. " if '__properties__' in dct:\n"
  35. " props = dct['__properties__']\n"
  36. " del dct['__properties__']\n"
  37. " if len(props) == 0:\n"
  38. " return dct\n"
  39. " instance = cls(__properties__ = props)\n"
  40. " else:\n"
  41. " instance = cls()\n"
  42. " if hasattr(instance, '__setstate__'):\n"
  43. " instance.__setstate__(dct)\n"
  44. " elif hasattr(instance, '__dict__'):\n"
  45. " instance.__dict__ = dct\n"
  46. " else:\n"
  47. " return dct\n"
  48. " return instance\n"
  49. " return dct");
  50. PyRun_SimpleString("def json_dump(*args, **kwargs):\n"
  51. " kwargs['cls'] = PyBindEncoder\n"
  52. " return json.dump(*args, **kwargs)\n"
  53. "def json_dumps(*args, **kwargs):\n"
  54. " kwargs['cls'] = PyBindEncoder\n"
  55. " return json.dumps(*args, **kwargs)");
  56. PyRun_SimpleString("def json_load(*args, **kwargs):\n"
  57. " kwargs['object_hook'] = PyBindObjectHook\n"
  58. " return json.load(*args, **kwargs)\n"
  59. "def json_loads(*args, **kwargs):\n"
  60. " kwargs['object_hook'] = PyBindObjectHook\n"
  61. " return json.loads(*args, **kwargs)");
  62. }
  63. namespace {
  64. struct TJSONBridge {
  65. TJSONBridge() {
  66. RegisterJSONBridgeImpl();
  67. }
  68. };
  69. }
  70. void NPyBind::RegisterJSONBridge() {
  71. Singleton<TJSONBridge>();
  72. }