python - 如何处理Python dict之类对象中的名称冲突?

标签 python

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

但是,其中一个文件列是“复制”,并且 DictLikeObject 有复制方法,因此我无法获取该列的正确值。

考虑下面的代码:

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”属性的值,而不是方法?

最佳答案

为什么不使用 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

关于python - 如何处理Python dict之类对象中的名称冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56674869/

相关文章:

python - Snakemake:在 Expand() 中使用正则表达式

python - 让MATLAB R2019b使用Python3.6

python - 跨维度将 softmax 应用于矩阵中的非零元素

python - 更改Seaborn的对线的回归线颜色

python - 适用于 Python 的 Google 云端硬盘 API : how to create credential?

python - 按特定顺序对文件进行排序

python - 带进度条的 Tkinter GUI

python - Python 函数中输出列表元素 "any"

python - 如何在pygame中生成随机矩形并使它们像飞扬的小鸟一样移动?

python - 创建一个可以增量更新的高效的基于文件的索引