gpt4 book ai didi

由于内置 max 函数的实现而导致的 Python 设计问题

转载 作者:行者123 更新时间:2023-12-01 04:20:13 25 4
gpt4 key购买 nike

我使用 Python 封装了一个强大的库(来自另一种语言),用于操作表达式和关系。就此而言,我广泛使用运算符重载,它的作用就像一个魅力。

现在,我需要定义一个 max 函数,该函数将应用于我的表达式,以生成一个新表达式,直观地表示“可迭代中所有表达式的最大值(这些表达式尚未评估)” ”

由于内置函数 max 使用迭代器和某种实现为 __leq__ 等的顺序关系(我用它来从两个表达式生成关系)当我在一组表达式上应用内置 max 时,我最终得到了废话。

更具体地说,

>>> max(e1, e2, e3)
e3

尽管我很想提出某种异常,说“请使用我在这里指出的特定函数,它将生成您合理期望的新表达式”

我的底线是,即使我有一个不同的函数来实现表达式的 max :

  • 我不想让这种行为保持原样,让用户认为他们执行 max(e1, e2, e3) 是安全的。
  • 我希望 max 像往常一样处理常规 Python 对象。

我能想到的解决这个问题的唯一方法是通过欺骗 maxkey 选项来在它命中特定对象时引发异常类型:

def newkey(p):
if isinstance(p, Expression):
raise SyntaxError("Use function `foo` for computing `max`")
# fallback to regular behaviour I know nothing about yet

max(e1, e2, e3, key=newkey)

现在我无法强制用户在每次调用 max 时指定 key 选项。事实上,如果可以的话,我会告诉他们无论如何使用不同的 max 函数......

你能找到解决这个问题的方法吗? (或更好的解决方法)

最佳答案

Since the built-in function max uses iterators and some kind of order relation implemented as __leq__, etc., (which I use for generating relations from two expressions)

丰富的比较方法返回的类型需要实现 __nonzero__ ,或__bool__在 Python 3 中,定义当您尝试将其解释为 bool 值时会发生什么。 __nonzero__ 有两种合理的可能性应该做。

如果实际评估底层表达式并执行比较是合理的,您可以设计 __nonzero__方法来做到这一点。如果您正在构建某种惰性操作库,这将是有意义的。在这种情况下,max会起作用,但它会隐式地强制对其参数进行评估。这可能并不理想。

或者,您也可以 __nonzero__引发类型错误。在这种情况下,当 max尝试确定两个表达式中哪一个更大,它会引发 TypeError。

关于由于内置 max 函数的实现而导致的 Python 设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33836343/

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