Skip to content

Instantly share code, notes, and snippets.

@alukach

alukach/Fails.py Secret

Last active December 29, 2015 08:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alukach/9e94e6e4d42f47f1667b to your computer and use it in GitHub Desktop.
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.
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
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