重复使用dict的功能是pythonic,而不是类似dict的功能吗?

时间:2016-11-19 12:57:32

标签: python class dictionary

我想使用括号表达式来访问dict中的值,但没有任何其他dict功能。

在下面的示例中,我使用表达式variable[something]以与variable相同的方式查询dict。后面没有dict的其他功能,计算返回的内容(something'color'时为颜色,其他内容为"hello"。< / p>

import random

class ColDict(dict):
    def __init__(self, *args):
        dict.__init__(self, args)
        self.colors = ['blue', 'white', 'red']
    def __getitem__(self, item):
        if item == 'color':
            random.shuffle(self.colors)
            return(self.colors[0])
        else:
            return("hello")

if __name__ == "__main__":
    col = ColDict()
    print(col['color'], col['color'], col['something']) # red white hello (changes on each call)

此代码按预期工作。

我想了解的是 dict功能(括号调用)的重用是否是pythonic,或者最后是否可以接受。

注意:我知道这可以通过其他方式(谎言一个函数)来完成,但我在重复使用括号调用时特意被诅咒。 重用,而不是滥用(这是我提问的核心)

2 个答案:

答案 0 :(得分:5)

如果您不需要dict的任何功能,请提供__getitem__()

import random

class ColDict:
    def __init__(self, *args):
        self.colors = ['blue', 'white', 'red']
    def __getitem__(self, item):
        if item == 'color':
            return random.choice(self.colors)
        else:
            return("hello")

if __name__ == "__main__":
    col = ColDict()
    print(col['color'], col['color'], col['something']) # red white hello (changes on each call)

read more about it

答案 1 :(得分:3)

是的,它是unpythonic。没有必要从字典继承,因为你获得的只是稍长的方法名称和属性访问语法。创建一个没有显式继承的普通类来返回随机颜色。由于您的类__getitem__为每个其他值返回一个常量,因此请创建一个具有常量的类或实例变量,该常量可以使用特定名称检索,而不仅仅是“不是color的任何内容”。如果您担心用户无法输入随机属性名称来访问该常量,请记住“应该有一个 - 最好只有一个 - 显而易见的方法”(来自PEP-20, The Zen of Python)。< / p>

import random

class ColObj:
    other = 'hello'
    def __init__(self, *args):
        self.colors = ['blue', 'white', 'red']
    def color(self):
            return random.choice(self.colors)

if __name__ == "__main__":
    col = ColObj()
    print(col.color, col.color, col.other)

如果这是所有类的,我根本不需要一个类 - 你可以简单地定义一个函数color和一个字符串(或其他常量)other。< / p>

import random

other = 'hello'
def color(colors=('blue', 'white', 'red')):
        return random.choice(colors)

if __name__ == "__main__":
    print(color(), color(), other)