钩子类型转换到Python中的dict

时间:2015-08-27 13:13:11

标签: python casting flask hook

简而言之,我有一个继承自Session的类dict(实际上,这个类会覆盖flask.SecureCookieSession类)。我还有一个客户端代码可以这样做:

session_data = dict(session)

我想以某种方式挂钩这个to dict转换,以便在序列化之前注入几行修改会话数据的代码。我怎么能用Python做到这一点?

UPD:澄清一下:我不希望从dict()电话中返回与dict对象不同的内容。我只是希望这个调用在获取数据以将其转换为dict对象之前调用我的会话对象的特殊方法。类似__to_dict(self)钩子的东西。

2 个答案:

答案 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,而是提供类似映射的对象。请考虑继承MutableMappingUserDict

答案 1 :(得分:0)

不是重载内置函数dict(),而是编写和调用自己的函数的最佳做法,例如:

def my_dict_func(session):
    fixed_session = do_extra_stuff(session)
    return dict(fixed_session)