开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 0 Fork 0

source-code-analysis/python3.8.1

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
python3.8.1
/
Doc
/
library
/
numbers.rst
python3.8.1
/
Doc
/
library
/
numbers.rst
numbers.rst 7.90 KB
一键复制 编辑 原始数据 按行查看 历史
zhangweibo 提交于 2021年11月16日 09:46 +08:00 . git init

:mod:`numbers` --- Numeric abstract base classes

.. module:: numbers
 :synopsis: Numeric abstract base classes (Complex, Real, Integral, etc.).

Source code: :source:`Lib/numbers.py`


The :mod:`numbers` module (:term:`abstract base classes <abstract base class>` which progressively define more operations. None of the types defined in this module can be instantiated.

The root of the numeric hierarchy. If you just want to check if an argument x is a number, without caring what kind, use isinstance(x, Number).

The numeric tower

Subclasses of this type describe complex numbers and include the operations that work on the built-in :class:`complex` type. These are: conversions to :class:`complex` and :class:`bool`, :attr:`.real`, :attr:`.imag`, +, -, *, /, :func:`abs`, :meth:`conjugate`, ==, and !=. All except - and != are abstract.

.. attribute:: real

 Abstract. Retrieves the real component of this number.

.. attribute:: imag

 Abstract. Retrieves the imaginary component of this number.

.. abstractmethod:: conjugate()

 Abstract. Returns the complex conjugate. For example, ``(1+3j).conjugate()
 == (1-3j)``.

To :class:`Complex`, :class:`Real` adds the operations that work on real numbers.

In short, those are: a conversion to :class:`float`, :func:`math.trunc`, :func:`round`, :func:`math.floor`, :func:`math.ceil`, :func:`divmod`, //, %, <, <=, >, and >=.

Real also provides defaults for :func:`complex`, :attr:`~Complex.real`, :attr:`~Complex.imag`, and :meth:`~Complex.conjugate`.

Subtypes :class:`Real` and adds :attr:`~Rational.numerator` and :attr:`~Rational.denominator` properties, which should be in lowest terms. With these, it provides a default for :func:`float`.

.. attribute:: numerator

 Abstract.

.. attribute:: denominator

 Abstract.

Subtypes :class:`Rational` and adds a conversion to :class:`int`. Provides defaults for :func:`float`, :attr:`~Rational.numerator`, and :attr:`~Rational.denominator`. Adds abstract methods for ** and bit-string operations: <<, >>, &, ^, |, ~.

Notes for type implementors

Implementors should be careful to make equal numbers equal and hash them to the same values. This may be subtle if there are two different extensions of the real numbers. For example, :class:`fractions.Fraction` implements :func:`hash` as follows:

def __hash__(self):
 if self.denominator == 1:
 # Get integers right.
 return hash(self.numerator)
 # Expensive check, but definitely correct.
 if self == float(self):
 return hash(float(self))
 else:
 # Use tuple's hash to avoid a high collision rate on
 # simple fractions.
 return hash((self.numerator, self.denominator))

Adding More Numeric ABCs

There are, of course, more possible ABCs for numbers, and this would be a poor hierarchy if it precluded the possibility of adding those. You can add MyFoo between :class:`Complex` and :class:`Real` with:

class MyFoo(Complex): ...
MyFoo.register(Real)

Implementing the arithmetic operations

We want to implement the arithmetic operations so that mixed-mode operations either call an implementation whose author knew about the types of both arguments, or convert both to the nearest built in type and do the operation there. For subtypes of :class:`Integral`, this means that :meth:`__add__` and :meth:`__radd__` should be defined as:

class MyIntegral(Integral):

 def __add__(self, other):
 if isinstance(other, MyIntegral):
 return do_my_adding_stuff(self, other)
 elif isinstance(other, OtherTypeIKnowAbout):
 return do_my_other_adding_stuff(self, other)
 else:
 return NotImplemented

 def __radd__(self, other):
 if isinstance(other, MyIntegral):
 return do_my_adding_stuff(other, self)
 elif isinstance(other, OtherTypeIKnowAbout):
 return do_my_other_adding_stuff(other, self)
 elif isinstance(other, Integral):
 return int(other) + int(self)
 elif isinstance(other, Real):
 return float(other) + float(self)
 elif isinstance(other, Complex):
 return complex(other) + complex(self)
 else:
 return NotImplemented

There are 5 different cases for a mixed-type operation on subclasses of :class:`Complex`. I'll refer to all of the above code that doesn't refer to MyIntegral and OtherTypeIKnowAbout as "boilerplate". a will be an instance of A, which is a subtype of :class:`Complex` (a : A <: Complex), and b : B <: Complex. I'll consider a + b:

  1. If A defines an :meth:`__add__` which accepts b, all is well.
  2. If A falls back to the boilerplate code, and it were to return a value from :meth:`__add__`, we'd miss the possibility that B defines a more intelligent :meth:`__radd__`, so the boilerplate should return :const:`NotImplemented` from :meth:`__add__`. (Or A may not implement :meth:`__add__` at all.)
  3. Then B's :meth:`__radd__` gets a chance. If it accepts a, all is well.
  4. If it falls back to the boilerplate, there are no more possible methods to try, so this is where the default implementation should live.
  5. If B <: A, Python tries B.__radd__ before A.__add__. This is ok, because it was implemented with knowledge of A, so it can handle those instances before delegating to :class:`Complex`.

If A <: Complex and B <: Real without sharing any other knowledge, then the appropriate shared operation is the one involving the built in :class:`complex`, and both :meth:`__radd__` s land there, so a+b == b+a.

Because most of the operations on any given type will be very similar, it can be useful to define a helper function which generates the forward and reverse instances of any given operator. For example, :class:`fractions.Fraction` uses:

def _operator_fallbacks(monomorphic_operator, fallback_operator):
 def forward(a, b):
 if isinstance(b, (int, Fraction)):
 return monomorphic_operator(a, b)
 elif isinstance(b, float):
 return fallback_operator(float(a), b)
 elif isinstance(b, complex):
 return fallback_operator(complex(a), b)
 else:
 return NotImplemented
 forward.__name__ = '__' + fallback_operator.__name__ + '__'
 forward.__doc__ = monomorphic_operator.__doc__

 def reverse(b, a):
 if isinstance(a, Rational):
 # Includes ints.
 return monomorphic_operator(a, b)
 elif isinstance(a, numbers.Real):
 return fallback_operator(float(a), float(b))
 elif isinstance(a, numbers.Complex):
 return fallback_operator(complex(a), complex(b))
 else:
 return NotImplemented
 reverse.__name__ = '__r' + fallback_operator.__name__ + '__'
 reverse.__doc__ = monomorphic_operator.__doc__

 return forward, reverse

def _add(a, b):
 """a + b"""
 return Fraction(a.numerator * b.denominator +
 b.numerator * a.denominator,
 a.denominator * b.denominator)

__add__, __radd__ = _operator_fallbacks(_add, operator.add)

# ...
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/python_sourcecode/python3.8.1.git
git@gitee.com:python_sourcecode/python3.8.1.git
python_sourcecode
python3.8.1
python3.8.1
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /