代码之家  ›  专栏  ›  技术社区  ›  Ξένη Γήινος

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

  •  0
  • Ξένη Γήινος  · 技术社区  · 4 年前

    我想知道如何检查一个变量是否为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 通过创建一个空的 mpfr 实例并使用其 __class__ 属性:

    isinstance(f, mpfr().__class__)
    

    我怎样才能访问 <class 'mpfr'> 直接地

    0 回复  |  直到 4 年前
        1
  •  5
  •   Kristian A.BEN    4 年前

    基于我在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
  •  1
  •   random_hooman    4 年前

    我想是因为 mpfr 这就是为什么 isinstance() 无法检查,这可能会起作用:

    isinstance(f, type(mpfr()))
    
        3
  •  0
  •   casevh    4 年前

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

    这已在下一版本的gmpy2中修复。2.1.0rc1的控制盘目前可用。rc2将很快发布,以解决某些平台上的兼容性问题。

    它可以通过命令进行安装

    pip安装gmpy2==2.1.0rc1

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

    推荐文章