Pregunta

Estoy corriendo Python 2.6.1 en Windows XP SP3. Mi IDE es PyCharm 1.0 Beta 2 Build PY-96.1055.

Estoy almacenando mis ficheros .py en un directorio llamado "src"; que tiene un archivo __init__.py que está vacía a excepción de un atributo "__author__" en la parte superior.

Uno de ellos se llama Matrix.py:

#!/usr/bin/env python
"""
"Core Python Programming" chapter 6.
A simple Matrix class that allows addition and multiplication
"""
__author__ = 'Michael'
__credits__ = []
__version__ = "1.0"
__maintainer__ = "Michael"
__status__ = "Development"

class Matrix(object):
    """
    exercise 6.16: MxN matrix addition and multiplication
    """
    def __init__(self, rows, cols, values = []):
        self.rows = rows
        self.cols = cols
        self.matrix = values

    def show(self):
        """ display matrix"""
        print '['
        for i in range(0, self.rows):
            print '(',
            for j in range(0, self.cols-1):
                print self.matrix[i][j], ',',
            print self.matrix[i][self.cols-1], ')'
        print ']'

    def get(self, row, col):
        return self.matrix[row][col]

    def set(self, row, col, value):
        self.matrix[row][col] = value

    def rows(self):
        return self.rows

    def cols(self):
        return self.cols

    def add(self, other):
        result = []
        for i in range(0, self.rows):
            row = []
            for j in range(0, self.cols):
                row.append(self.matrix[i][j] + other.get(i, j))
            result.append(row)
        return Matrix(self.rows, self.cols, result)

    def mul(self, other):
        result = []
        for i in range(0, self.rows):
            row = []
            for j in range(0, other.cols):
                sum = 0
                for k in range(0, self.cols):
                    sum += self.matrix[i][k]*other.get(k,j)
                row.append(sum)
            result.append(row)
        return Matrix(self.rows, other.cols, result)

    def __cmp__(self, other):
        """
        deep equals between two matricies
        first check rows, then cols, then values
        """
        if self.rows != other.rows:
            return self.rows.cmp(other.rows)
        if self.cols != other.cols:
            return self.cols.cmp(other.cols)
        for i in range(0, self.rows):
            for j in range(0, self.cols):
                if self.matrix[i][j] != other.get(i,j):
                    return self.matrix[i][j] == (other.get(i,j))
        return True # if you get here, it means size and values are equal



if __name__ == '__main__':
    a = Matrix(3, 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    b = Matrix(3, 3, [[6, 5, 4], [1, 1, 1], [2, 1, 0]])
    c = Matrix(3, 3, [[2, 0, 0], [0, 2, 0], [0, 0, 2]])
    a.show()
    b.show()
    c.show()
    a.add(b).show()
    a.mul(c).show()

He creado un nuevo directorio llamado "test", que también tiene un archivo __init__.py que está vacía a excepción de un atributo "__author__" en la parte superior. He creado una unidad de MatrixTest.py a mi clase Matrix:

#!/usr/bin/env python
"""
Unit test case for Matrix class
See http://jaynes.colorado.edu/PythonGuidelines.html#module_formatting for Python coding guidelines
"""

import unittest #use my unittestfp instead for floating point
from src import Matrix # Matrix class to be tested

__author__ = 'Michael'
__credits__ = []
__license__ = "GPL"
__version__ = "1.0"
__maintainer__ = "Michael"
__status__ = "Development"

class MatrixTest(unittest.TestCase):
    """Unit tests for Matrix class"""
    def setUp(self):
        self.a = Matrix.Matrix(3, 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9]])
        self.b = Matrix.Matrix(3, 3, [[6, 5, 4], [1, 1, 1], [2, 1, 0]])
        self.c = Matrix.Matrix(3, 3, [[2, 0, 0], [0, 2, 0], [0, 0, 2]])

    def testAdd(self):
        expected = Matrix.Matrix(3, 3, [[7, 7, 7], [5, 6, 7], [9, 9, 9]])    # need to learn how to write equals for Matrix
        self.a.add(self.b)
        assert self.a == expected

if __name__ == '__main__':    #run tests if called from command-line
    suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
    unittest.TextTestRunner(verbosity=2).run(suite)

Sin embargo, cuando trato de ejecutar mi MatrixTest consigo este error:

C:\Tools\Python-2.6.1\python.exe "C:/Documents and Settings/Michael/My Documents/Projects/Python/learning/core/test/MatrixTest.py"
Traceback (most recent call last):
  File "C:/Documents and Settings/Michael/My Documents/Projects/Python/learning/core/test/MatrixTest.py", line 8, in <module>
    from src import Matrix # Matrix class to be tested
ImportError: No module named src

Process finished with exit code 1

Todo lo que he leído me dice que tiene el init .py en todos mis directorios debe hacerse cargo de esto.

Si alguien podría señalar lo que me he perdido lo agradecería muchísimo.

También me gustaría asesoramiento sobre la mejor manera de desarrollar y mantener las clases de origen y los exámenes de unidad. Estoy pensando en esto de la manera que suele hacer cuando escribo Java: src / y / directorios de prueba, con estructuras de paquetes idénticos debajo. Es esta forma de pensar "Pythonic", o debería considerar otro esquema de organización?

ACTUALIZACIÓN:

Gracias a los que han contestado, aquí está la solución que funcionó para mí:

  1. Cambiar a la importación from src import Matrix # Matrix class to be tested
  2. Añadir sys.path como una variable de entorno para la configuración de mi unittest, con ./src y directorios ./test separados por punto y coma.
  3. Cambiar declaraciones en MatrixTest.py como se muestra.
¿Fue útil?

Solución

Esto es un poco de una suposición, pero creo que se necesita cambiar su PYTHONPATH variable de entorno para incluir el src y prueba directorios.

Ejecutar programas en el directorio src pueden haber estado trabajando, porque Python inserta automáticamente el directorio del script que se está ejecutando actualmente en sys.path. Así que la importación de módulos en src habría trabajado todo el tiempo que también está ejecutando un script que reside en src.

Pero ahora que está ejecutando un script desde test, el directorio test se añade automáticamente a sys.path, mientras src no lo es.

Todos los directorios listados en PYTHONPATH agregarán al sys.path, y las búsquedas para encontrar Python sys.path módulos.

Además, si usted dice

from src import Matrix

A continuación, Matrix se referiría al paquete, y que había necesidad de decir Matrix.Matrix para acceder a la clase.

Otros consejos

En cuanto a las mejores prácticas, pycurl utiliza un directorio al mismo tests nivel que el código fuente principal. En los otros proyectos de mano como Twisted o SORL-miniatura utilizar un subdirectorio test(s) bajo el código de fuente principal.

La otra mitad de la pregunta ya ha sido respondida por ~ unutbu .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top