пространство имен по умолчанию для python doctest - PullRequest
7 голосов
/ 07 октября 2011

В документах моего модуля я хотел бы сослаться на мой модуль с полным пространством имен, например:

  hp.myfunc(1)

И я бы хотел избежать беспорядка в документах, написав:

  import healpy as hp

в каждом из документов.

если я запускаю doctest.testmod, я знаю, что для этого могу использовать ключевое слово globs, а если я запускаю нос, я могу использовать функцию setup.

Есть ли другой стандартный способ работы с обоими?

Ответы [ 2 ]

3 голосов
/ 14 октября 2011

Как вы управляете doctests (то есть без носа)? Если вы попали в каталог с пакетом при попытке их запуска, у вас возникнут проблемы (если вы выполняете полный импорт).

Мне удалось получить простой doctest (с полностью квалифицированным импортом), работающий с обоими тестами носа и встроенным бегуном doctest. Вот мои настройки:

Структура проекта:

.
└── mypackage
    ├── __init__.py
    └── mod.py

Вот содержимое моего файла 'mod.py':

"""foo() providing module

Example:
    >>> import mypackage.mod
    >>> mypackage.mod.foo()
    'bar'
"""

def foo():
    return "bar"

от '.' каталог (корень проекта), теперь я могу запускать тесты:

$ python -m doctest -v mypackage/*.py
1 items had no tests:
    __init__
0 tests in 1 items.
0 passed and 0 failed.
Test passed.
Trying:
    import mypackage.mod
Expecting nothing
ok
Trying:
    mypackage.mod.foo()
Expecting:
    'bar'
ok
1 items had no tests:
    mod.foo
1 items passed all tests:
   2 tests in mod
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

А теперь тесты носа:

$ nosetests --with-doctest
.
----------------------------------------------------------------------
Ran 1 test in 0.008s

OK

Если я пытаюсь запустить doctest из каталога «mypackage», я получаю сообщение об ошибке (я подозреваю, что происходит в вашем случае).

Наконец, я не думаю, что это должно иметь значение, но я использую Python 2.7.2

2 голосов
/ 28 октября 2011

Я не знаю насчет носа, но вы можете использовать аргумент globs в testmod() и testfile().

Вот простой модуль (называемый foobar.py), обратите внимание, что я делаюне импортировать os:

#!/usr/bin/python
"""
    >>> os.pipe
    <built-in function pipe>
"""

Вы можете протестировать модуль следующим образом (пример консоли):

$ python2.7
Python 2.7.2 (default, Jun 29 2011, 11:10:00) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import doctest, foobar
2
>>> doctest.testmod(foobar)  ## will fail as expected because os has not been imported
**********************************************************************
File "foobar.py", line 2, in foobar
Failed example:
    os.pipe
Exception raised:
    Traceback (most recent call last):
      File "/usr/lib/python2.7/doctest.py", line 1254, in __run
        compileflags, 1) in test.globs
      File "<doctest foobar[0]>", line 1, in <module>
        os.pipe
    NameError: name 'os' is not defined
**********************************************************************
1 items had failures:
   1 of   1 in foobar
***Test Failed*** 1 failures.
TestResults(failed=1, attempted=1)
>>> import os
>>> globs = {'os': os}
>>> doctest.testmod(foobar, globs=globs)
TestResults(failed=0, attempted=1)
>>> # Win :)

Ваш пример должен сказать:

globs = {'hp': healp}
...