Question

Je suis en Python 2.6.1 sous Windows XP SP3. Mon IDE est PyCharm 1.0 Beta 2 Build PY-96,1055.

Je stocker mes fichiers .py dans un répertoire nommé « src »; il a un fichier __init__.py qui est vide à l'exception d'un attribut « __author__ » en haut.

L'un d'eux est appelé 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()

Je l'ai créé un nouveau répertoire nommé « test » qui a également un fichier __init__.py qui est vide à l'exception d'un attribut « __author__ » en haut. J'ai créé un MatrixTest.py à l'unité de ma classe 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)

Pourtant, quand je tente de lancer mon MatrixTest je reçois cette erreur:

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

Tout ce que je lu ai me dit que d'avoir la init .py dans tous mes répertoires doivent prendre soin de cela.

Si quelqu'un pouvait indiquer ce que j'ai manqué je l'apprécie grandement.

Je voudrais aussi des conseils sur la meilleure façon de développer et de maintenir les classes source et tests unitaires. Je pense à ce la façon dont je fais habituellement quand j'écris Java: / src et / répertoires de tests, avec des structures de paquet identiques dessous. Est-ce la pensée « Pythonic », ou devrais-je envisager un autre schéma d'organisation?

Mise à jour:

Merci à tous ceux qui ont répondu, voici la solution qui a fonctionné pour moi:

  1. Modifier importation from src import Matrix # Matrix class to be tested
  2. Ajouter sys.path comme une variable d'environnement à ma configuration unittest, avec ./src et répertoires séparés par ./test point-virgule.
  3. Modifier les déclarations dans MatrixTest.py comme indiqué.
Était-ce utile?

La solution

Ceci est un peu une supposition, mais je pense que vous devez changer votre PYTHONPATH variable d'environnement pour inclure le src et le test répertoires.

programmes en cours dans le répertoire src peuvent avoir travaillé, parce que Python insère automatiquement le répertoire du script, il est en cours d'exécution dans sys.path. Donc, importer des modules dans src aurait travaillé aussi longtemps que vous exécutez également un script qui réside dans src.

Mais maintenant que vous exécutez un script à partir test, le répertoire test est automatiquement ajouté à sys.path, alors que src n'est pas.

Tous les répertoires listés dans PYTHONPATH sont ajoutés à sys.path, et les recherches Python sys.path pour trouver des modules.

En outre, si vous dites

from src import Matrix

alors Matrix se réfère à l'ensemble, et vous auriez besoin de dire Matrix.Matrix pour accéder à la classe.

Autres conseils

En ce qui concerne les meilleures pratiques, pycurl utilise un répertoire tests à la niveau comme le principal code source. Sur les autres projets de la main comme Twisted ou SORL-miniature utiliser un sous-répertoire test(s) sous le code source principal.

a déjà répondu à l'autre moitié de la question par ~ unutbu .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top