python lxml 在将 kwargs 作为 dict 处理时抛出键错误 bool

python lxml throwing key error bool while processing kwargs as dict

我正在尝试使用以下代码片段链接 Django Q() 对象:

excludes = None
for val in service_dict.values():
    field_filter_name = field_name.format(val)
    exclude_filter = {field_filter_name + "__isnull": True}
    if excludes is None:
        excludes = Q(**exclude_filter)
    else:
        excludes |= Q(**exclude_filter)

在 运行 时间,当代码在第一个循环中命中 excludes = Q(**exclude_filter) 行时,抛出此错误:

File "/lib/python3.6/site-packages/lxml/builder.py", line 218, in call
    get(dict)(elem, attrib)
File "/lib/python3.6/site-packages/lxml/builder.py", line 205, in add_dict
    attrib[k] = typemap[type(v)](None, v)
KeyError: <class 'bool'>

我很确定这些值是字符串类型。 但这是在相同环境中的 python shell 上工作的:

In [9]: Q(**{"foo__isnull": True})
Out[9]: <Q: (AND: ('foo__isnull', True))>

环境外我也试过:

>>> a = {'foo': True}
>>> def k(foo):
...     print(foo)
... 
>>> k(**a)
True

另一方面; kwargs 的这种用法在代码的任何其他部分都有效。

如何解决这个问题?

编辑:

完整追溯:

Traceback (most recent call last):
  File "/env/lib/python3.6/site-packages/django/contrib/staticfiles/handlers.py", line 63, in __call__
    return self.application(environ, start_response)
  File "/env/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 170, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in get_response
    response = self._middleware_chain(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 133, in __call__
    response = self.get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = response_for_exception(request, exc)
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 86, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 128, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/env/lib/python3.6/site-packages/django_extensions/management/technical_response.py", line 6, in null_technical_500_response
    six.reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.6/site-packages/six.py", line 686, in reraise
    raise value
  File "/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/env/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/project/foobar/products/views.py", line 1267, in product_list_view
    filters, excludes = apply_filters(request)
  File "/project/foobar/products/views.py", line 1085, in apply_filters
    excludes = Q(**exclude_filter)
  File "/env/lib/python3.6/site-packages/lxml/builder.py", line 218, in __call__
    get(dict)(elem, attrib)
  File "/env/lib/python3.6/site-packages/lxml/builder.py", line 205, in add_dict
    attrib[k] = typemap[type(v)](None, v)
KeyError: <class 'bool'>

推测您已经实例化了一个 lxml 对象并在您的代码前面调用了它 Q,这将覆盖您从 django.db.models 导入的 Q 对象。重命名对象。