简而言之,我有一个继承自Session
的类dict
(实际上,这个类会覆盖flask.SecureCookieSession
类)。我还有一个客户端代码可以这样做:
session_data = dict(session)
我想以某种方式挂钩这个to dict
转换,以便在序列化之前注入几行修改会话数据的代码。我怎么能用Python做到这一点?
UPD:澄清一下:我不希望从dict()
电话中返回与dict对象不同的内容。我只是希望这个调用在获取数据以将其转换为dict对象之前调用我的会话对象的特殊方法。类似__to_dict(self)
钩子的东西。
答案 0 :(得分:4)
如果我们查看source code for dict
,我们可以看到当使用dict
子类调用dict
时,不会调用任何用户方法:
int
PyDict_Merge(PyObject *a, PyObject *b, int override)
{
/* ... */
if (PyDict_Check(b)) {
other = (PyDictObject*)b;
/* ...
Only other->ma_keys and other->ma_values are used.
No user-defined methods/attributes are accessed.
...
*/
}
/* ... */
}
这是特定于CPython的性能优化。
为了能够检测何时复制字典,您应该避免继承dict
,而是提供类似映射的对象。请考虑继承MutableMapping或UserDict。
答案 1 :(得分:0)
不是重载内置函数dict()
,而是编写和调用自己的函数的最佳做法,例如:
def my_dict_func(session):
fixed_session = do_extra_stuff(session)
return dict(fixed_session)