1

変数が 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という名前の属性が 1 つだけありmpfr、それが上記の関数です。

ただし、mpfr関数の出力のクラスも呼び出されmpfrます。

>>> f.__class__
mpfr

しかし、これはメイン名前空間mpfrの関数ではありません:mpfr

>>> type(f) == mpfr
False

mpfrこれまでのところ、空のmpfrインスタンスを作成し、その__class__属性を使用して、変数が のインスタンスであるかどうかを確認することしかできませんでした。

isinstance(f, mpfr().__class__)

<class 'mpfr'>直接アクセスするにはどうすればよいですか?

4

3 に答える 3

5

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
于 2021-09-20T06:47:46.960 に答える