13

この問題では、IPv6ネットワークアドレス空間を扱っているので、長さは2^(128-subnet)です。

python(少なくともこのマシンでは)は、からの戻り値として最大64ビットの符号付き数値を処理するようです__len__()。動作しますlen(IP('2001::/66'))が、len(IP('2001::/65'))失敗します。

from IPy import IP
len(IP('2001::/64'))
Traceback (most recent call last):
  File "test.py", line 2, in <module>
      len(IP('2001::/64'))
OverflowError: long int too large to convert to int

問題のIPyライブラリはhttps://github.com/haypo/python-ipyにあります。

これを処理する方法についての提案、またはそれが私が立ち往生している制限である可能性があることを示唆していますか?

4

1 に答える 1

13

あなたが直面している問題は、PythonのCAPIにはコンテナの長さに関するシステム依存の制限があるということです。つまり、C関数は、標準のC型の符号付きバージョンでPyObject_Sizeある値を返します。サイズはシステムによって異なりますが、おそらく32ビットシステムでは32ビット、64ビットシステムでは64ビットです。Py_ssize_tsize_t

組み込みlen関数はを使用するPyObject_Sizeため、同じ制限があります。現在の実装は次のとおりです。

static PyObject *
builtin_len(PyObject *self, PyObject *v)
{
    Py_ssize_t res;

    res = PyObject_Size(v);
    if (res < 0 && PyErr_Occurred())
        return NULL;
    return PyInt_FromSsize_t(res);
}

ビルトインを呼び出すのではなくlen、オブジェクトのメソッドを使用することで、この制限を回避できます。IPlen

IP('2001::/64').len()

これは純粋なPythonであるため、整数サイズに制限はありません。

于 2013-03-27T03:12:48.640 に答える