<p>没有通用的方法可以做到这一点。数字一开始并不严格相关,它们的类型甚至更少</p>
<hr/>
<p>虽然<code>numbers.Number</code>看起来像是“数字的类型”,但它不是通用的。例如,<a href="https://www.python.org/dev/peps/pep-3141/#the-decimal-type" rel="nofollow noreferrer">^{<cd2>} is explicitly not a ^{<cd1>}</a>作为子类、子类型或虚拟子类。特别是对于键入,<code>numbers.Number</code>是<a href="https://www.python.org/dev/peps/pep-0484/#the-numeric-tower" rel="nofollow noreferrer">not endorsed by PEP 484 Type Hints</a></p>
<p>为了有意义地键入提示“数字”,必须明确定义该上下文中的数字。这可能是预先存在的数值类型集,例如<code>int</code><;:<code>float</code><;:<code>complex</code>,数值类型的{<cd8>}/{<cd9>},定义运算和代数结构的{<cd10>},或类似</p>
<pre class="lang-py prettyprint-override"><code>from typing import TypeVar
from decimal import Decimal
from fractions import Fraction
#: typevar of rational numbers if we squint real hard
Q = TypeVar("Q", float, Decimal, Fraction)
</code></pre>
<hr/>
<p>所有这些都表明,“数字的类型”甚至没有什么意义。即使是<em>特定的</em><code>numbers.Number</code>实际上也没有任何特性:它不能转换为具体类型,也不能实例化为有意义的数字</p>
<p>相反,使用“数字的类型”<em>some</em>type of number:</p>
<pre class="lang-py prettyprint-override"><code>from typing import Type
def zero(t: Type[Q]) -> Q:
return t() # all Type[Q]s can be instantiated without arguments
print(zero(Fraction))
</code></pre>
<p>如果<code>Type</code>的唯一目标是创建实例,那么最好是请求一个<code>Callable</code>。这包括类型和工厂功能</p>
<pre class="lang-py prettyprint-override"><code>def one(t: Callable[[int], Q]) -> Q:
return t(1)
</code></pre>