<p><strong>编辑:</strong></p>
<p>确实有一个<a href="http://bugs.python.org/msg58786" rel="noreferrer">patch</a>包含了<code>sign()</code>在<a href="http://docs.python.org/library/math.html#math.copysign" rel="noreferrer">math</a>中,但是没有被接受,因为他们在<a href="http://bugs.python.org/msg59137" rel="noreferrer">what it should return in all the edge cases</a>(+/-0,+/-nan等)上意见不一致</p>
<p>所以他们决定只实现copysign,它可以是<a href="http://bugs.python.org/msg59154" rel="noreferrer">used to delegate to the end user the desired behavior for edge cases</a>-也可以是<a href="http://bugs.python.org/msg59152" rel="noreferrer">sometimes might require the call to ^{<cd2>}</a>。</p>
<hr/>
<p>我不知道为什么它不是内置的,但我有一些想法。</p>
<pre><code>copysign(x,y):
Return x with the sign of y.
</code></pre>
<p>最重要的是,<code>copysign</code>是<code>sign</code>的超集!用x=1调用<code>copysign</code>与<code>sign</code>函数相同。所以你可以用<code>copysign</code>和<em>忘记它</em>。</p>
<pre><code>>>> math.copysign(1, -4)
-1.0
>>> math.copysign(1, 3)
1.0
</code></pre>
<p>如果你厌倦了传递两个完整的参数,你可以通过这种方式实现<code>sign</code>,它仍然与其他人提到的IEEE的东西兼容:</p>
<pre><code>>>> sign = functools.partial(math.copysign, 1) # either of these
>>> sign = lambda x: math.copysign(1, x) # two will work
>>> sign(-4)
-1.0
>>> sign(3)
1.0
>>> sign(0)
1.0
>>> sign(-0.0)
-1.0
>>> sign(float('nan'))
-1.0
</code></pre>
<p>其次,通常当你想要某物的符号时,你只需要将它与另一个值相乘。当然,这基本上就是<code>copysign</code>所做的。</p>
<p>所以,不要:</p>
<pre><code>s = sign(a)
b = b * s
</code></pre>
<p>你可以这样做:</p>
<pre><code>b = copysign(b, a)
</code></pre>
<p>是的,我很惊讶你已经使用Python 7年了,并且认为<code>cmp</code>可以很容易地被<code>sign</code>移除并替换!您是否从未使用<code>__cmp__</code>方法实现过类?您是否从未调用过<code>cmp</code>并指定过自定义比较器函数?</p>
<p>总而言之,我发现自己也想要一个<code>sign</code>函数,但是<code>copysign</code>第一个参数是1的情况下工作得很好。我不同意<code>sign</code>比<code>copysign</code>更有用,因为我已经证明它只是相同功能的子集。</p>