如何创建类似dict的对象,该对象通过items()返回重复的值

火炉

构架

我正在使用超级框架来生成HTTP / 2通信。在生成请求和响应时,我目前正在使用hyper.HTTP20Connection.requesth2.H2Connection.send_headers分别发送HTTP / 2请求和响应。

我的要求

我需要能够发送具有重复字段的HTTP / 2请求和响应。例如,这里是一个YAML指定的请求,其中包含两个x-test-duplicate字段:

  headers:
    fields:
    - [ :method, GET, equal ]
    - [ :scheme, https, equal ]
    - [ :authority, example.data.com, equal ]
    - [ :path, '/a/path?q=3', equal ]
    - [ Accept, '*/*' ]
    - [ Accept-Language, en-us ]
    - [ Accept-Encoding, gzip ]
    - [ x-test-duplicate, first ]
    - [ x-test-duplicate, second ]
    - [ Content-Length, "0" ]

请注意,根据HTTP / 2规范,这是明确允许的。参见示例RFC 7541第2.3.2节

动态表可以包含重复的条目(即,具有相同名称和相同值的条目)。因此,解码器不得将重复的条目视为错误。

我的问题

问题是,尽管h2.H2Connection.send_headers正确处理了可包含重复字段(例如(("name1", "value1"), ("name2", "value2"), ("name1", "another_value"))的元组的迭代但是hyper.HTTP20Connection.request需要一个字典,该字典当然不是为重复键设计的。该文档是不清楚其类型要求headers,但在为源代码HTTP20Connection:请求,线261items()被称为的其关闭。如果我通过一个可迭代的元组,则得到AttributeError: 'tuple' object has no attribute 'items'请注意,这是多么令人难过:超级框架迫使用户传递不允许重复的字典,然后立即通过将该字典转换为可迭代的元组items(),后者将允许重复的字段。如果像h2的界面一样,只花了一个可迭代的元组作为开始,我就不会遇到这个问题。

我的问题

在超级github项目中提交了有关此限制的问题437同时,我希望我可以解决此问题。我有一个可重复的元组,表示具有重复字段的HTTP / 2标头。我能否以某种方式将其包装在对象中,以便当HTTP20Connection:request的第261行对其调用items()时,它仅返回元组的可迭代对象?

威姆

Python通常EmailMessage为此使用一个实例(docs)。

类似EmailMessage字典的接口由标头名称索引,标头名称必须是ASCII值。字典的值是带有一些额外方法的字符串。标头以保留大小写的形式存储和返回,但是字段名称不区分大小写。与真正的字典不同,这些键有一个顺序,并且可以有重复的键。提供了其他方法来处理具有重复键的标头。

在基本用法中,您将使用设置项目,然后使用EmailMessage.add_header进行检索EmailMessage.items您可以将有效负载留空。

>>> headers = EmailMessage()
>>> headers.add_header("x-test-duplicate", "first")
>>> headers.add_header("x-test-duplicate", "second")
>>> headers.items()
[('x-test-duplicate', 'first'), ('x-test-duplicate', 'second')]

urllib本身就是经过战斗测试的,它对HTTPResponse标头使用相同的类

滚动自己的multidict或使用简单的对列表的好处是,您将获得标头的正确行为(RFC 5322和RFC 6532样式字段名称和值),例如,不区分大小写:

>>> headers.add_header("aBc", "val1")
>>> headers.add_header("AbC", "val2")
>>> headers.get_all("ABC")
['val1', 'val2']

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何创建该对象?

如何每次通过在Python中调用相同的dict值来返回新对象?

如何通过2个对象的相同值创建对象?

如何在不创建重复对象的情况下展平该对象流?

如何获取该对象的值?

如何避免重复的对象创建

如何创建一个“ forEach”,该对象将作为接收方的对象返回给使用函数?

如何使用 json 模块将 python 对象转换为 (json) 嵌套 dict,而不创建类似文件的对象?

我的函数返回一个对象,但是我无法通过返回值访问该对象的属性。

如何返回一个对象,该对象显示每个唯一值的总出现次数?

如何通过单个属性的值从数组返回对象

如何从 dict 中创建对象,其中键是名称对象,值是属性?使用循环

通过 GET 更新对象值而不重复

通过该值中的特定对象过滤掉对象

从具有重复值的数组创建对象

如何使Glom与类似dict的对象一起工作

如何从对象返回值?

如何设置该对象的值?(Java 14)

通过函数的值返回的对象的地址

通过数组值返回对象

Ruby on Rails,如何返回在该时间段内创建对象的天数

如果值等于对象数组中某个对象的键,则返回该对象的值javasciprt

如何创建一个表(或其他对象),该表始终返回传递给其WHERE子句的值,如镜像

返回在 runSync 方法中创建的对象的值

按值返回不会创建新对象

从通过.data()创建的jQuery对象访问值

当某些行为该相关对象返回空值时,如何使用select_related()?

如何将对象映射到该对象的单个值?

如何从线程返回类对象并创建返回对象的向量?