gpt4 book ai didi

python - 字典键的Javascript样式点符号unpythonic?

转载 作者:IT老高 更新时间:2023-10-28 22:20:40 30 4
gpt4 key购买 nike

我已经开始使用这样的结构:

class DictObj(object):
def __init__(self):
self.d = {}
def __getattr__(self, m):
return self.d.get(m, None)
def __setattr__(self, m, v):
super.__setattr__(self, m, v)

更新:基于此线程,我已将 DictObj 实现修改为:

class dotdict(dict):
def __getattr__(self, attr):
return self.get(attr, None)
__setattr__= dict.__setitem__
__delattr__= dict.__delitem__

class AutoEnum(object):
def __init__(self):
self.counter = 0
self.d = {}
def __getattr__(self, c):
if c not in self.d:
self.d[c] = self.counter
self.counter += 1
return self.d[c]

其中 DictObj 是可以通过点符号访问的字典:

d = DictObj()
d.something = 'one'

我觉得它比 d['something'] 更美观。请注意,访问未定义的键会返回 None 而不是引发异常,这也很好。

更新:Smashery 提出了一个很好的观点,mhawke 对此进行了扩展以获得更简单的解决方案。我想知道使用 dict 而不是定义新字典是否有任何不良副作用;如果没有,我非常喜欢 mhawke 的解决方案。

AutoEnum 是一个自增枚举,使用如下:

CMD = AutoEnum()

cmds = {
"peek": CMD.PEEK,
"look": CMD.PEEK,
"help": CMD.HELP,
"poke": CMD.POKE,
"modify": CMD.POKE,
}

两者对我来说都很好,但我对它们感到很奇怪。

这些实际上是坏的结构吗?

最佳答案

您的 DictObj 示例实际上很常见。如果您正在处理“类似于对象的事物”,那么对象样式的点符号访问可能是一个胜利,即。它们具有固定的属性名称,仅包含在 Python 标识符中有效的字符。诸如数据库行或表单提交之类的东西可以有用地存储在这种对象中,从而使代码更具可读性,而无需过多的 ['item access']。

实现有点受限——你不会得到 dict、len()、comparisons、'in'、iteration 或 nice reprs 这样的构造函数语法。你当然可以自己实现这些东西,但是在新风格类的世界里,你可以通过简单地继承 dict 来免费获得它们:

class AttrDict(dict):
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__

要获得 default-to-None 行为,只需子类化 Python 2.5 的 collections.defaultdict 类而不是 dict。

关于python - 字典键的Javascript样式点符号unpythonic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/224026/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com