这是我的项目结构(只是举例说明问题):
.
├── 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测试不在包内。我可以移动它们,但是有可能不改变项目结构吗?
答案 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()