我在我的应用程序周围的不同位置使用了dotdict来增强代码的可读性。我一点也不知道这会给以后带来很多问题。一个特别恼人的情况是它似乎与复制库不兼容。在
这就是我所说的dotdict
class DotDict(dict):
"""dot.notation access to dictionary attributes"""
__getattr__ = dict.get
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
例如,一种访问字典属性的方法:dictionary.attribute
当我尝试的时候
^{pr2}$我得到以下错误:
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/copy.py in deepcopy(x, memo, _nil)
167 reductor = getattr(x, "__reduce_ex__", None)
168 if reductor:
--> 169 rv = reductor(4)
170 else:
171 reductor = getattr(x, "__reduce__", None)
TypeError: 'NoneType' object is not callable
我认为这是因为它无法识别我的类DotDict,因此认为它是非类型的。在
有人知道怎么解决这个问题吗?可能会重写副本库的有效类型?在
实现自定义数据结构的拷贝相当简单,smth就是这样
输出
^{pr2}$您没有提供dict的实现,我假设它响应的类方法是
items()
如果不是,那么一定有一种方法可以迭代所有的键和值另外,我假设键和值是不可变的对象,而不是数据结构,否则您还需要复制“k”和“v”(可能使用origin
copy
lib)从错误发生的地方来看,},而是一个内置函数,这意味着错误发生在C代码中我们看不到回溯的地方。但我的猜测是,它试图获取一个不确定存在的方法,如果不存在,就准备捕捉
reductor
不是{AttributeError
。相反,它调用.get
,后者返回None
,没有错误,因此它尝试调用该方法。在其行为正确:
我知道这与您的原始类的行为不同,而且您将无法将
.
用于可选键,但是我认为有必要避免这样的错误,因为外部代码希望您的类以可预测的方式运行。在编辑:以下是实现deepcopy并保留原始
^{pr2}$__getattr__
的方法:测试:
相关问题 更多 >
编程相关推荐