2010-01-09 5 views
3

Ce code qui est dans le doctest fonctionne lorsqu'il est exécuté seul, mais dans ce doctest il échoue à 10 endroits. Je n'arrive pas à comprendre pourquoi. Ce qui suit est l'ensemble du module:Python: Pourquoi ce test de doc échoue-t-il?

class requireparams(object): 
    """ 
    >>> @requireparams(['name', 'pass', 'code']) 
    >>> def complex_function(params): 
    >>>  print(params['name']) 
    >>>  print(params['pass']) 
    >>>  print(params['code']) 
    >>> 
    >>> params = { 
    >>>  'name': 'John Doe', 
    >>>  'pass': 'OpenSesame', 
    >>>  #'code': '1134', 
    >>> } 
    >>> 
    >>> complex_function(params) 
    Traceback (most recent call last): 
     ... 
    ValueError: Missing from "params" argument: code 
    """ 
    def __init__(self, required): 
     self.required = set(required) 

    def __call__(self, params): 
     def wrapper(params): 
      missing = self.required.difference(params) 
      if missing: 
       raise ValueError('Missing from "params" argument: %s' % ', '.join(sorted(missing))) 
     return wrapper 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

Répondre

7

doctest exige que vous utilisez ... pour les lignes de continuation:

>>> @requireparams(['name', 'pass', 'code']) 
... def complex_function(params): 
...  print(params['name']) 
...  print(params['pass']) 
...  print(params['code']) 
... 
>>> params = { 
...  'name': 'John Doe', 
...  'pass': 'OpenSesame', 
...  #'code': '1134', 
... } 
... 
>>> complex_function(params) 
1

Essayez de coller le code exactement à l'invite du python. Cela signifie qu'il contiendra certains ... ainsi que >>>. Sinon, l'analyseur doctest ne saura pas s'il existe une expression multiligne.

En aperçu: Ce que Greg a dit.

0

Voici mon module après je l'ai corrigé (il fonctionne maintenant):

class requiresparams(object): 
    """ 

    Used as a decorator with an iterable passed in, this will look for each item 
    in the iterable given as a key in the params argument of the function being 
    decorated. It was built for a series of PayPal methods that require 
    different params, and AOP was the best way to handle it while staying DRY. 


    >>> @requiresparams(['name', 'pass', 'code']) 
    ... def complex_function(params): 
    ...  print(params['name']) 
    ...  print(params['pass']) 
    ...  print(params['code']) 
    >>> 
    >>> params = { 
    ...  'name': 'John Doe', 
    ...  'pass': 'OpenSesame', 
    ...  #'code': '1134', 
    ... } 
    >>> 
    >>> complex_function(params) 
    Traceback (most recent call last): 
     ... 
    ValueError: Missing from "params" argument: code 
    """ 
    def __init__(self, required): 
     self.required = set(required) 

    def __call__(self, params): 
     def wrapper(params): 
      missing = self.required.difference(params) 
      if missing: 
       raise ValueError('Missing from "params" argument: %s' % ', '.join(sorted(missing))) 
     return wrapper 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 
Questions connexes