#31734: warnings.warn() fails when looping over memcache_key_warnings()
-------------------------------------+-------------------------------------
Reporter: Rich Rauenzahn | Owner: nobody
Type: Bug | Status: new
Component: Core (Cache system) | Version: 2.2
Severity: Normal | Resolution:
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 1 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Rich Rauenzahn:
Old description:
> I think I found a bug in cache backends -- while running unit tests I was
> getting:
>
> TypeError: 'type' object cannot be interpreted as an integer
>
> I'm not sure why that exact message, but it arises here:
>
> {{{
> > .../virtualenv-3.6.8/lib64/python3.6/site-
> packages/django/core/cache/backends/base.py(250)validate_key()
> 248 """
> 249 for warning in memcache_key_warnings(key):
> --> 250 warnings.warn(warning, CacheKeyWarning)
> 251
> 252 def incr_version(self, key, delta=1, version=None):
>
> }}}
>
> I think the problem is that for loop is receiving a list of tuples, but
> they are interpreted as a list of strings:
>
> {{{
> ipdb> key
> ":1:<redacted but probably invalid for memcache"
>
> # The generator returns tuples of (message, warning type)
>
> ipdb> for x in memcache_key_warnings(key): print(x)
> ('Cache key contains characters that will cause errors if used with
> memcached:
> ":1:BuildAPI._request:(\'http://buildapi.eng.vmware.com/sb/build/1895757\',
> expire=10)"', <class 'django.core.cache.backends.base.CacheKeyWarning'>)
>
> # But "warning" passed to warning.warn() is the tuple...
>
> ipdb> warning
> ('Cache key contains characters that will cause errors if used with
> memcached:
> ":1:BuildAPI._request:(\'http://buildapi.eng.vmware.com/sb/build/1895757\',
> expire=10)"', <class 'django.core.cache.backends.base.CacheKeyWarning'>)
> ipdb>
> }}}
>
> I think it should be passing warning.warn(warning[0], warning[1]) or
> warning.warn(*warning)
>
> Django 2.2.13 is what I am using.
New description:
I think I found a bug in cache backends -- while running unit tests I was
getting:
TypeError: 'type' object cannot be interpreted as an integer
I'm not sure why that exact message, but it arises here:
{{{
> .../virtualenv-3.6.8/lib64/python3.6/site-
packages/django/core/cache/backends/base.py(250)validate_key()
248 """
249 for warning in memcache_key_warnings(key):
--> 250 warnings.warn(warning, CacheKeyWarning)
251
252 def incr_version(self, key, delta=1, version=None):
}}}
I think the problem is that for loop is receiving a list of tuples, but
they are interpreted as a list of strings:
{{{
ipdb> key
":1:<redacted but probably invalid for memcache"
# The generator returns tuples of (message, warning type)
ipdb> for x in memcache_key_warnings(key): print(x)
('Cache key contains characters that will cause errors if used with
memcached:
":1:BuildAPI._request:(\'http://buildapi.eng.vmware.com/sb/build/1895757\',
expire=10)"', <class 'django.core.cache.backends.base.CacheKeyWarning'>)
# But "warning" passed to warnings.warn() is the tuple...
ipdb> warning
('Cache key contains characters that will cause errors if used with
memcached:
":1:BuildAPI._request:(\'http://buildapi.eng.vmware.com/sb/build/1895757\',
expire=10)"', <class 'django.core.cache.backends.base.CacheKeyWarning'>)
ipdb>
}}}
I think it should be passing warnings.warn(warning[0], warning[1]) or
warnings.warn(*warning)
Django 2.2.13 is what I am using.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/31734#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/066.3612698ca929c75e86d00ee6da595f63%40djangoproject.com.