#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.

Reply via email to