1
XYxe 2017-04-10 12:45:14 +08:00
在 deepcopy 里面会去找参数对象的__deepcopy__方法,如果可以找到这个方法就直接调用它进行拷贝。
但是在这里 DotDict 对象没有__deepcopy__,所以就会有 KeyError 。 deepcopy 里面调用 getattr 的时候会 except AttributeError ,所以在__getattr__里面抛出这个异常可以正常运行了。 |
2
dxandlight OP @XYxe dict 本身是有__deepcopy__这个的,不会继承么? 还有就是抛出异常,所以也能捕获到啊,然后打印出异常了,那没有,是怎么处理的。
|
3
XYxe 2017-04-10 20:27:20 +08:00 1
@dxandlight #2 dict 没有__deepcopy__吧,你什么版本的?
getattr 源代码里是这样的: ``` result = PyObject_GetAttr(v, name); if (result == NULL && dflt != NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); Py_INCREF(dflt); result = dflt; } ``` 其中 v,name,dflt 是 getattr 的三个参数。 也就是如果在 v 里面没找到 name ,并且设置了 dflt 参数,并且发生的错误是 AttributeError ,就把错误清除,然后把 dflt 作为结果返回回去。 换成 Python 的代码大概是: ``` try: result = v.name except AttributeError: result = dflt return result ``` |
4
dxandlight OP @XYxe OK 我大概了解了, dict 确实没有__deepcopy__这样的属性,我在仔细研究下,谢谢!
|