Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur dans un doctest

    14 mai 2011 à 16:05:56

    Bonjour

    J'ai écris un petit module pour me simplifier l'impression de block data dans un fichier avec un format. J'ai essayé de faire un doctest pour la fonction et ça ne fonctionne pas, j'ai une erreur lorsque j'exécute le fichier.

    Voici le module :

    #/usr/bin/python
    # -*- coding=utf-8 -*-
    
    import doctest
    import os
    
    def datatofile( blockdata, fichier = "data.dat", dataformat = "empty", header = "" ):
        """ Print data into file 'fichier' 
    
        >>> data = [ range(2) for i in range(3) ]
        >>> datatofile.datatofile( data, "doctest_data.dat", "1x3d;1x2d")
        >>> f = open("doctest_data.dat","r")
        >>> f.read()
        '# file written with datatofile module : doctest_data.dat\n#\n  0  1\n  0  1\n  0  1\n'
    
        """
    
        # read format
        if dataformat == "empty":
            dataformatlist = [ "{:15g}" if isinstance(d,int) or isinstance(d,float) else "{:>15s}" for d in blockdata[0]]
    
        else:
            dataformatinfo = dataformat.replace(" ", "").split(";")
            dataformatlist = list()
            for datafmt in dataformatinfo:
                try:
                    nfmt = int(datafmt.split("x")[0])
                except ValueError:
                    print("\nError : in first you have to give a number")
                    print("format for data is           : {0}".format(dataformat))
                    print("format should be in the form : 1x5d;4x8.3f")
                    return
    
                fmt = datafmt.split("x")[1] 
                for i in range(nfmt):
                    dataformatlist.append("{:" + fmt + "}")
    
            # check format info and data length
            if len(dataformatlist) != len(blockdata[0]):
                print("\nError : too many or not enought format information")
                print("Number of data   : {0}".format(len(blockdata[0])))
                print("Number of format : {0}".format(len(dataformatlist)))
                return
    
        # file exist ?
        answer = ""
        while answer != "y":
            if os.path.exists( fichier ):
                answer = raw_input("File {0} exists, overwrite it ? (y/n) : ".format(fichier)).lower()
            else:
                answer = "y"
    
            if answer == "n":
                fichier = raw_input("Enter a new file name : ")
            elif answer == "y":
                continue
            else:
                print("hit 'y' for yes or 'n' for no")
    
        # open file and write header
        fout = open( fichier, "w")
        fout.write("# file written with datatofile module : {0}\n".format(fichier))
        fout.write(header)
        fout.write("#\n")
    
        for dataline in blockdata:
            try:
                line = " ".join([ fmt.format(data) for data, fmt in zip(dataline, dataformatlist) ])
            except ValueError:
                print("\nError : data and format unconsistant")
                print("Data format list :")
                print(dataformatlist)
                print("Line of data which gives the error :")
                print(dataline)
                return
            fout.write(line + "\n")
    
        fout.close()
    
    if __name__ == "__main__":
        doctest.testmod()
    



    Et voici l'erreur :
    > python --version
    Python 2.7.1+
    
    > python datatofile.py
    Traceback (most recent call last):
      File "datatofile.py", line 81, in <module>
        doctest.testmod()
      File "/usr/lib/python2.7/doctest.py", line 1850, in testmod
        for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
      File "/usr/lib/python2.7/doctest.py", line 865, in find
        self._find(tests, obj, name, module, source_lines, globs, {})
      File "/usr/lib/python2.7/doctest.py", line 919, in _find
        globs, seen)
      File "/usr/lib/python2.7/doctest.py", line 907, in _find
        test = self._get_test(obj, name, module, globs, source_lines)
      File "/usr/lib/python2.7/doctest.py", line 991, in _get_test
        filename, lineno)
      File "/usr/lib/python2.7/doctest.py", line 610, in get_doctest
        return DocTest(self.get_examples(string, name), globs,
      File "/usr/lib/python2.7/doctest.py", line 624, in get_examples
        return [x for x in self.parse(string, name)
      File "/usr/lib/python2.7/doctest.py", line 586, in parse
        self._parse_example(m, name, lineno)
      File "/usr/lib/python2.7/doctest.py", line 656, in _parse_example
        lineno + len(source_lines))
      File "/usr/lib/python2.7/doctest.py", line 742, in _check_prefix
        (lineno+i+1, name, line))
    ValueError: line 8 of the docstring for __main__.datatofile has inconsistent leading whitespace: '#'


    J'ai l'impression que quelque chose le gène avec les # dans le doc test. J'ai essayé de les remplacer par autre chose mais ça me donne la même erreur.

    Bien entendu si vous avez d'autres remarques sur la fonction ça m'intéresse aussi :) !
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      14 mai 2011 à 17:40:43

      c'est les '\n' dans ton doctest qu'il aime pas, il faut les virer

      Dans un doctest, tu écris comme dans un texte

      met ton code en mode secret
      • Partager sur Facebook
      • Partager sur Twitter
        14 mai 2011 à 22:27:03

        Comment je peux faire pour les virer ? Les retour à la ligne sont importants et font partie du résultats.

        Je ne comprend pas ce que tu veux dire par "dans un doctest, tu écris comme dans un texte". Il faut passer à la ligne à chaque \n ?

        J'ai essayé avec ça :
        """ Print data into file 'fichier' 
        
            >>> data = [ range(2) for i in range(3) ]
            >>> datatofile( data, "doctest_data.dat", "1x3d;1x2d")
            >>> f = open("doctest_data.dat","r")
            >>> f.read()
            # file written with datatofile module : doctest_data.dat
            #
              0  1
              0  1
              0  1
        
        
            """
        


        J'ai eu ça :
        > python datatofile.py
        **********************************************************************
        File "datatofile.py", line 13, in __main__.datatofile
        Failed example:
            f.read()
        Expected:
            # file written with datatofile module : doctest_data.dat
            #
              0  1
              0  1
              0  1
        Got:
            '# file written with datatofile module : doctest_data.dat\n#\n  0  1\n  0  1\n  0  1\n'
        **********************************************************************
        1 items had failures:
           1 of   4 in __main__.datatofile
        ***Test Failed*** 1 failures.

        Lui dans le résultat il a bien les \n.

        J'ai mis mon code en secret, c'est pour minimiser le post que tu me demandes ça ?

        Merci pour ton aide
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          14 mai 2011 à 23:37:59

          essai voir ceci

          def datatofile( blockdata, fichier = "data.dat", dataformat = "empty", header = "" ):
             """ Print data into file 'fichier' 
              >>> data = [ range(2) for i in range(3) ]
              >>> datatofile.datatofile( data, "doctest_data.dat", "1x3d;1x2d")
              >>> f = open("doctest_data.dat","r")
              >>> f.read()
              '#file written with datatofile module : doctest_data.dat
              #0  1
               0  1
               0  1'
             """
          


          Oui secret pour diminuer la taille du post

          question : pourquoi les \n dans un commentaire? si j'ai bien compris car les doctests c'est pas ce que j'utilise tous les jours
          • Partager sur Facebook
          • Partager sur Twitter
            30 juillet 2011 à 12:30:29

            Désolé de remonter un vieux sujet, il suffit d"échaper" tes retours à la ligne dans tes résultats:

            '# file written with datatofile module : doctest_data.dat\\n#\\n  0  1\\n  0  1\\n  0  1\\n'
            


            J'ai eut le même problème récemment et je l'ai résolut de cette manière.

            En espérant t'avoir aidé.
            • Partager sur Facebook
            • Partager sur Twitter

            erreur dans un doctest

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown