如何处理像对象一样的python dict中的名称冲突?

时间:2019-06-19 19:48:10

标签: python

在一个用例中,我正在读取一个pickle文件,并将文件内容放入自定义DictLikeObject中。

但是,文件列之一是'copy'并且DictLikeObject具有copy方法,由于该原因,我无法获取该列的正确值。

考虑以下代码:

class DictLikeObject(dict):

    def __getattr__(self, key):
        try:
            return self[key]
        except AttributeError:
            raise ValueError("Not Found")

    def copy(self):
        pass

row = DictLikeObject()
row['copy'] = 1;
row['state'] = 'completed'

print(getattr(row, 'state'))
completed

print(getattr(row, 'copy'))
<bound method DictObject.copy of {'copy': 1, 'state': 'completed'}>

有没有办法确保getattr返回'copy'属性的值而不是方法?

2 个答案:

答案 0 :(得分:1)

为什么不使用dict.get来获取属性,这将确保搜索键,而不是类的属性。它还消除了定义自定义__getattr__ dunder方法的需求

print(row.get('copy'))
print(row.get('state'))

输出将为

1
completed

尽管要使用getattr,也可以改用__getattribute__

class DictLikeObject(dict):

    #Overrode getattribute
    def __getattribute__(self, key):
        try:
            return self[key]
        except AttributeError:
            raise ValueError("Not Found")

    def copy(self):
        pass

row = DictLikeObject()
row['copy'] = 1
row['state'] = 'completed'

print(getattr(row, 'state'))
print(getattr(row, 'copy'))

输出将为

completed
1

答案 1 :(得分:0)

为此,您应该使用dict.copy,否则getattr将返回您所看到的copy的类方法。

print(row.get('state'))    
print(row.get('copy'))