如何使Python绝对导入行更短?

时间:2016-03-29 16:48:30

标签: python testing pytest

这是我的项目结构(只是举例说明问题):

.
├── hello_world
│   ├── __init__.py
│   └── some
│       └── very_nested
│           └── stuff.py
└── tests
    └── test_stuff.py

test_stuff.py文件(适用于py.test):

from hello_world.some.very_nested.stuff import Magic
from hello_world.some.very_nested.other_stuff import MoreMagic

def test_magic_fact_works():
    assert Magic().fact(3) == 6

# ...

有什么方法可以缩短导入行吗?他们在实际项目中的时间过长。

例如,这样会很好,但它不起作用:)

import hello_world.some.very_nested as vn
from vn.stuff import Magic
from vn.other_stuff import MoreMagic

我不能使用相对导入(我假设)beucase测试不在包内。我可以移动它们,但是有可能不改变项目结构吗?

2 个答案:

答案 0 :(得分:0)

正如@jonrsharpe所说,你可以用django风格聚合你的包:

"""
Django validation and HTML form handling.
"""

from django.core.exceptions import ValidationError  # NOQA
from django.forms.boundfield import *  # NOQA
from django.forms.fields import *  # NOQA
from django.forms.forms import *  # NOQA
from django.forms.formsets import *  # NOQA
from django.forms.models import *  # NOQA
from django.forms.widgets import *  # NOQA

在您的子包中,例如:django.forms.widgets添加:

__all__ = (
    'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'NumberInput',
    'EmailInput', 'URLInput', 'PasswordInput', 'HiddenInput',
    'MultipleHiddenInput', 'FileInput', 'ClearableFileInput', 'Textarea',
    'DateInput', 'DateTimeInput', 'TimeInput', 'CheckboxInput', 'Select',
    'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
    'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget',
    'SplitHiddenDateTimeWidget', 'SelectDateWidget',
)

要在使用import *时指定要导入的项目,这样您就可以根据需要整理您的包,并同时保持对它们的访问。

在你的情况下,它会是这样的:

<强>程序hello_world / __初始化__。PY

from hello_world.some.very_nested.stuff import *
from hello_world.some.very_nested.other_stuff import *

例如,在测试中导入包时,您会得到:from hello_world import Magic

答案 1 :(得分:0)

加入hello_world/__init__.py

from __future__ import absolute_import
from .some import *

进入hello_world/some/__init__.py

from __future__ import absolute_import
from .very_nested import *

进入hello_world/some/very_nested/__init__.py

from __future__ import absolute_import
from .stuff import Magic
from .other_stuff import MoreMagic

如果hello_world/some/very_nested/stuff.py包含:

class Magic:
    pass

hello_world/some/very_nested/other_stuff.py包含:

class OtherMagic:
    pass

然后你可以轻松导入它。 tests/test_stuff.py

import pytest
from hello_world import Magic
from hello_world import MoreMagic

@pytest.mark.parametrize('cls', [Magic, MoreMagic])
def test_magic(cls):
    assert cls()