2013-04-08 3 views
0

Я пытаюсь создать 2D-массивы в python с использованием c-типов. Для этого я создал два модуля arrays.py и array2D.pyAttributeError: экземпляр Array не имеет атрибута '__trunc__'

TraceBack является:

Traceback (most recent call last): 

File "C:\Python27\Lib\array2D.py", line 52, in <module> 

arr = Array2D(2,4) 

File "C:\Python27\Lib\array2D.py", line 15, in __init__ 

self._theRows[i] = arrays.Array(numCols) 

File "C:\Python27\Lib\arrays.py", line 37, in __setitem__ 

self._elements[ index ] = value 

AttributeError: Array instance has no attribute '__trunc__' 

Код

модуль arrays.py

import ctypes 

class Array: 

#Creates an array with size elements. 
def __init__(self, size): 
    assert size > 0, "Array size must be > 0" 
    self._size = size 
    print "sixe is %s" %self._size 

# Create the array structure using the ctypes module. 
    PyArrayType = ctypes.c_int * size 
    self._elements = PyArrayType() 
    print "type is e", type(self._elements) 
    #self._elements = ctypes.c_int * size 


# Initialize each element. 
    #for i in range(self._size): 
    #self.clear(i) 


# Returns the size of the array. 
def __len__(self): 
    return self._size 

# Gets the contents of the index element. 
def __getitem__(self, index): 
    assert index >= 0 and index < len(self), "Array subscript out of range" 
    return self._elements[ index ] 

# Puts the value in the array element at index position. 
def __setitem__(self, index, value): 
    assert index >= 0 and index < len(self), "Array subscript out of range" 
    print "Type is ", type(index) 
    f._index = (index) 
    self._elements[ index ] = value 


# Clears the array by setting each element to the given value. 
    def clear(self, value): 
     for i in range(len(self)) : 
      self._elements[i] = value 

array2D .py

import arrays 


class Array2D : 
# Creates a 2-D array of size numRows x numCols. 
    def __init__(self, numRows, numCols): 

# Create a 1-D array to store an array reference for each row. 
     self._theRows = arrays.Array(numRows) 

# Create the 1-D arrays for each row of the 2-D array. 
    for i in range(numRows) : 
     self._theRows[i] = arrays.Array(numCols) 

# Returns the number of rows in the 2-D array. 
    def numRows(self): 
     return len(self._theRows) 

# Returns the number of columns in the 2-D array. 
    def numCols(self): 
     return len(self._theRows[0]) 

# Clears the array by setting every element to the given value. 
    def clear(self, value): 
     for row in range(self.numRows()): 
      row.clear(value) 

# Gets the contents of the element at position [i, j] 
    def __getitem__(self, ndxTuple): 
     assert len(ndxTuple) == 2, "Invalid number of array subscripts." 
     row = ndxTuple[0] 
     col = ndxTuple[1] 
     assert row >= 0 and row < self.numRows() \ 
      and col >= 0 and col < self.numCols(), \ 
      "Array subscript out of range." 
     the1dArray = self._theRows[row] 
     return the1dArray[col] 


# Sets the contents of the element at position [i,j] to value. 
    def __setitem__(self, ndxTuple, value): 
     assert len(ndxTuple) == 3, "Invalid number of array subscripts." 
     row = ndxTuple[0] 
     col = ndxTuple[1] 
     assert row >= 0 and row < self.numRows() \ 
     and col >= 0 and col < self.numCols(), \ 
      "Array subscript out of range." 
     the1dArray = self._theRows[row] 
     the1dArray[col] = value 


Forming the 2d array using the following line 

arr = Array2D(2,4) 

print "arr is %s" %arr 

Может кто-нибудь, пожалуйста, дайте мне знать, что я делаю неправильно здесь?

+4

Это не очень хорошая идея, чтобы поставить свои собственные модули в папку, где стандартная библиотека Python является. –

+0

Спасибо, что сообщили мне о Джанне. Я изменю это. – Bharath

ответ

0

Мне кажется, что здесь вы пытаетесь хранить Array экземпляр в массив, который принимает ctypes.c_int экземпляров:

# Create a 1-D array to store an array reference for each row. 
     self._theRows = arrays.Array(numRows) 

# Create the 1-D arrays for each row of the 2-D array. 
    for i in range(numRows) : 
     self._theRows[i] = arrays.Array(numCols) 
+0

Спасибо, что указали, что нет Janne. Он работает, если я изменяю тип массива от ctypes.c_int до ctypes_py_object. Но я также хотел бы знать, что связано с этим ошибкой «no attribute» trunc ». Не могли бы вы поделиться, если у вас есть идея по этому поводу? – Bharath

+2

@ user2260089 '__trunc__' используется' math.trunc' и является одним из способов попытаться принудить объект к целому числу. Я не смог воспроизвести точную ошибку, потому что код, который вы опубликовали, не запускается. –

Смежные вопросы