【问题标题】:How to check if a variable is an instance of mpfr in Python 3?如何检查变量是否是 Python 3 中 mpfr 的实例?
【发布时间】:2021-09-20 06:00:45
【问题描述】:

我想知道如何检查变量是否为 mpfr 类型,这听起来很简单,但简单的 isinstance(v, mpfr) 无法做到这一点。

示例:创建一个变量是mpfr的实例,如何验证该变量是mpfr的实例?

import gmpy2
from gmpy2 import mpfr

f = mpfr('0.5')

最直观的方式失败了:

>>> isinstance(TAU, mpfr)
TypeError: isinstance() arg 2 must be a type or tuple of types

因为mpfr是一个函数:

>>> mpfr
<function gmpy2.mpfr>

gmpy2只有一个属性mpfr,就是上面的函数。

不过mpfr函数的输出类也叫mpfr

>>> f.__class__
mpfr

但是这个mpfr 不是主命名空间中的mpfr 函数:

>>> type(f) == mpfr
False

到目前为止,我只通过创建一个空的mpfr 实例并使用它的__class__ 属性来检查变量是否是mpfr 的实例:

isinstance(f, mpfr().__class__)

如何直接访问&lt;class 'mpfr'&gt;

【问题讨论】:

  • if f.__class__ == 'mpfr' : ... 呢?
  • @Kristian f.__class__ == 'mpfr'False,属性不是 str...

标签: python python-3.x isinstance gmpy


【解决方案1】:

基于我在python REPL上尝试的快速实验,我发现最简单的方法是将类名mpfr转换为字符串,并与字符串比较进行比较:

$ python3
Python 3.9.7 (default, Aug 31 2021, 13:28:12) 
[GCC 11.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from gmpy2 import mpfr
>>> f = mpfr('0.5')
>>> f.__class__
<class 'mpfr'>
>>> str(f.__class__)
"<class 'mpfr'>"
>>> str(f.__class__) == "<class 'mpfr'>"
True
>>>

或者,如果您不想使用__class__,因为它应该是私有数据成员,那么您可以改用type(f)

>>> str(type(f)) == "<class 'mpfr'>"
True

如果您不关心创建新的 mpfr 实例但更喜欢语法糖,则可以选择另一种选择:

>>> type(f) == type(mpfr())
True

【讨论】:

    【解决方案2】:

    我认为因为mpfr 是一个函数,所以isinstance() 无法检查,这可能会起作用:

    isinstance(f, type(mpfr()))
    

    【讨论】:

      【解决方案3】:

      @PYC 的回答是正确的,将适用于当前版本和下一个主要版本。

      这已在 gmpy2 的下一个版本中得到修复。 2.1.0rc1 的轮子目前可用。 rc2 即将发布以修复某些平台上的兼容性问题。

      可以通过命令安装

      pip install gmpy2==2.1.0rc1

      或适用于您的系统的等效 pip 命令。

      【讨论】:

        猜你喜欢
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 2014-10-03
        • 2017-11-14
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多