如何在 Python 3 中检查变量是否是 mpfr 的实例?

How to check if a variable is an instance of mpfr in Python 3?

提问人:Ξένη Γήινος 提问时间:9/20/2021 更新时间:9/22/2021 访问量:112

问:

我想知道如何检查变量是否为 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

但是,函数输出的类也称为:mpfrmpfr

>>> f.__class__
mpfr

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

>>> type(f) == mpfr
False

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

isinstance(f, mpfr().__class__)

如何直接访问?<class 'mpfr'>

python-3.x 是实例 gmpy

评论

0赞 Kristian 9/20/2021
怎么样?if f.__class__ == 'mpfr' : ...
0赞 Ξένη Γήινος 9/20/2021
@Kristian是,该属性不是...f.__class__ == 'mpfr'Falsestr

答:

5赞 Kristian 9/20/2021 #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
1赞 random_hooman 9/21/2021 #2

我认为因为是一个无法检查的功能,所以这可能会起作用:mpfrisinstance()

isinstance(f, type(mpfr()))
0赞 casevh 9/22/2021 #3

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

此问题已在 gmpy2 的下一个版本中修复。目前提供 2.1.0rc1 的轮子。RC2 即将发布,以修复某些平台上的兼容性问题。

可以使用命令安装

pip 安装 gmpy2==2.1.0rc1

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