【问题标题】:Why aren't dictionaries callable?为什么字典不可调用?
【发布时间】:2014-07-30 10:48:33
【问题描述】:

拥有一个要映射到另一个对象的对象列表是一个常见的编程问题。这通常通过字典来完成:

l1=[1,2,3]
d={1:'_ONE', 2:'_TWO', 3:'_THREE'}
l2= [d[i] for i in l1]

在许多情况下,很自然地将字典视为将键映射到值的函数。然后,您只需 l2= map(d,l1) 而不是使用列表理解(或丑陋的 map(d.__getitem__,l1)

当然,既然 python 非常灵活,你可以很容易地得到这个行为:

class CallableDict(dict):
    def __call__(self, k):
        return self[k]

但这显然在访问不是您自己创建的字典时不起作用。

默认情况下不能调用基本 Python 字典有充分的理由吗?

免责声明:这个问题的动机主要是 ruby​​,字典是这样工作的

【问题讨论】:

  • 因为调用与索引完全不同?在 Python 中,也有一种明显的做某事的方法,添加调用支持将添加另一种做某事的方法。
  • 另外,i 可能不在d 中:map(d.get, l) 会更好,因为它可以阻止KeyError(当然,您可能不希望这样)。
  • @MartijnPieters “一种显而易见的方法”可能是最有力的理由。我认为“索引”的概念几乎不适合字典(字典将“索引”定义为“材料的顺序排列,尤其是按字母或数字顺序”),但当然,这就是大多数编程语言的做法
  • @goncalopp:官方名称是subscription;调用与订阅根本不同,这两个动作是不同的。
  • 您说得有点对,因为在许多情况下,获取项目或获取属性是由函数调用处理的,因此对于这些情况,“订阅”边界是模糊的。

标签: python dictionary functional-programming call


【解决方案1】:

应该有一种——最好只有一种——明显的方式来做到这一点。 http://legacy.python.org/dev/peps/pep-0020/

如果你让dict 可调用来为字典下标,那么现在你有两种方法可以做同样的事情:

d[k]  # Existing
d(k)  # Proposed

即使你提出的情况,有一个可调用的传递给map,也已经有了一个明显的解决方案:

map(d.get, it)  # Existing
map(d, it)      # Proposed

您的提案似乎没有任何特别的优势,而且它重复了已经很明显的方式。

【讨论】:

  • 无耻地从 Martijn Pieters 和 jonrsharpe 那里偷走。此答案是一个社区 wiki,请随时编辑和改进。
猜你喜欢
  • 2011-06-09
  • 2020-02-13
  • 2013-03-04
  • 2023-03-13
  • 2013-03-21
  • 2019-02-01
  • 2011-06-06
  • 2014-08-04
  • 2021-07-01
相关资源
最近更新 更多