-
-
Save alukach/9e94e6e4d42f47f1667b to your computer and use it in GitHub Desktop.
Investigation into why a function used as a `@staticmethod` causes Python to enter into a recursive death spin while using it as a stand-alone function operates as expected.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import simplejson as json | |
from django.db import models | |
from django_hstore import hstore | |
class HStoreJsonDict(hstore.DictionaryField): | |
@staticmethod | |
def _unpack_json(value): | |
try: | |
value = json.loads(value) | |
except TypeError: | |
pass | |
return value | |
@staticmethod | |
def _load_json(value): | |
try: | |
value = json.dumps(value) | |
except Exception as e: | |
# Is this needed? | |
print(value, e) | |
pass | |
return value | |
def __getattribute__(self, key): | |
value = super(HStoreJsonDict, self).__getattribute__(key) | |
return self._unpack_json(value) | |
def __getitem__(self, key): | |
value = super(HStoreJsonDict, self).__getattribute__(key) | |
return self._unpack_json(value) | |
def __setattr__(self, key, value): | |
value = self._load_json(value) | |
return super(HStoreJsonDict, self).__setattr__(key, value) | |
class TestModel(models.Model): | |
name = models.CharField(max_length=64) | |
data = HStoreJsonDict(db_index=True) | |
objects = hstore.HStoreManager() | |
# Traceback (most recent call last): | |
# File "manage.py", line 10, in <module> | |
# execute_from_command_line(sys.argv) | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line | |
# utility.execute() | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute | |
# self.fetch_command(subcommand).run_from_argv(self.argv) | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv | |
# self.execute(*args, **options.__dict__) | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/core/management/base.py", line 231, in execute | |
# self.validate() | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/core/management/base.py", line 266, in validate | |
# num_errors = get_validation_errors(s, app) | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/core/management/validation.py", line 30, in get_validation_errors | |
# for (app_name, error) in get_app_errors().items(): | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/db/models/loading.py", line 158, in get_app_errors | |
# self._populate() | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/db/models/loading.py", line 64, in _populate | |
# self.load_app(app_name, True) | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/db/models/loading.py", line 88, in load_app | |
# models = import_module('.models', app_name) | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module | |
# __import__(name) | |
# File "/home/alukach/Projects/keyvalue-django-model-tests/events/models.py", line 38, in <module> | |
# class TestModel(models.Model): | |
# File "/home/alukach/Projects/keyvalue-django-model-tests/events/models.py", line 40, in TestModel | |
# data = HStoreJsonDict(db_index=True) | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django_hstore/fields.py", line 36, in __init__ | |
# super(HStoreField, self).__init__(*args, **kwargs) | |
# File "/home/alukach/.virtualenvs/keyvalue/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 83, in __init__ | |
# self.name = name | |
# File "/home/alukach/Projects/keyvalue-django-model-tests/events/models.py", line 35, in __setattr__ | |
# value = self._load_json(value) | |
# File "/home/alukach/Projects/keyvalue-django-model-tests/events/models.py", line 28, in __getattribute__ | |
# return self._unpack_json(value) | |
# File "/home/alukach/Projects/keyvalue-django-model-tests/events/models.py", line 28, in __getattribute__ | |
# return self._unpack_json(value) | |
# File "/home/alukach/Projects/keyvalue-django-model-tests/events/models.py", line 28, in __getattribute__ | |
# return self._unpack_json(value) | |
# ... | |
# File "/home/alukach/Projects/keyvalue-django-model-tests/events/models.py", line 28, in __getattribute__ | |
# return self._unpack_json(value) | |
# RuntimeError: maximum recursion depth exceeded |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import simplejson as json | |
from django.db import models | |
from django_hstore import hstore | |
def _unpack_json(value): | |
try: | |
value = json.loads(value) | |
except TypeError: | |
pass | |
return value | |
class HStoreJsonDict(hstore.DictionaryField): | |
@staticmethod | |
def _load_json(value): | |
try: | |
value = json.dumps(value) | |
except Exception as e: | |
# Is this needed? | |
print(value, e) | |
pass | |
return value | |
def __getattribute__(self, key): | |
value = super(HStoreJsonDict, self).__getattribute__(key) | |
return _unpack_json(value) | |
def __getitem__(self, key): | |
value = super(HStoreJsonDict, self).__getitem__(key) | |
return _unpack_json(value) | |
def __setattr__(self, key, value): | |
value = self._load_json(value) | |
return super(HStoreJsonDict, self).__setattr__(key, value) | |
class TestModel(models.Model): | |
name = models.CharField(max_length=64) | |
data = HStoreJsonDict(db_index=True) | |
objects = hstore.HStoreManager() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment