1

私の関数では、入力のタイプが有効になるようにチェックします(たとえば、「n」の素数性をチェックする関数の場合、「n」を文字列として入力したくない)。longこの問題は、 sとsのチェックで発生しintます。Python 3.3では、long-type番号が削除されたため、次の問題が発生します。

def isPrime(n):
    """Checks if 'n' is prime"""
    if not isinstance(n, int): raise TypeError('n must be int')
    # rest of code

これは、v2.7とv3.3の両方で普遍的に機能します。ただし、この関数をPython 2.7プログラムにインポートし、long次のように「n」に-type番号を入力すると、「n」はタイプではなくタイプでisPrime(123456789000)あるため、明らかに発生します。TypeErrorlongint

longでは、 sとsのv2.7とv3.3の両方で有効な入力であるかどうかを確認するにはどうすればよいintですか?

ありがとう!

4

3 に答える 3

7

私が考えることができる方法は次のとおりです。

from numbers import Integral

>>> blah = [1, 1.2, 1L]
>>> [i for i in blah if isinstance(i, Integral)]
[1, 1L]

編集(@martineauからの洞察に満ちたコメントの後)

Python 2.7:

>>> map(type, [1, 1.2, 2**128])
[<type 'int'>, <type 'float'>, <type 'long'>]

Python 3.3:

>>> list(map(type, [1, 1.2, 2**128]))
[<class 'int'>, <class 'float'>, <class 'int'>]

この例は、それを使用していることを示してisinstance(n, numbers.Integral)いますが、より一貫性があります。

于 2013-02-11T18:06:53.410 に答える
0
def isPrime(n):
    """Checks if 'n' is prime"""
    try:
        n = int(n)
    except:
        raise TypeError('n must be int')
    # rest of code
于 2013-02-11T20:05:59.893 に答える
-2

差出人: http: //docs.python.org/3.1/whatsnew/3.0.html#integers

整数の値に制限がなくなったため、sys.maxint定数が削除されました。ただし、sys.maxsizeは、実際のリストまたは文字列インデックスよりも大きい整数として使用できます。これは、実装の「自然な」整数サイズに準拠しており、通常、同じプラットフォーム上の以前のリリースのsys.maxintと同じです(同じビルドオプションを想定)。

if not isinstance(n, int) or n > sys.maxsize: raise TypeError('n must be int')

intとlongを区別するために機能する場合があります。

于 2013-02-11T19:36:25.703 に答える