【问题标题】:Best practice to locate "attempted relative import beyond top-level package"定位“顶级包之外的尝试相对导入”的最佳实践
【发布时间】:2020-04-04 14:15:33
【问题描述】:

我想通过在导入中包含异常处理来缩小常见错误"attempted relative import beyond top-level package"

DjangoProject/tests.py 的 Django 测试中,我编写了相对于自身 (tests.py) 的导入。 执行每个测试文件的默认 unittests.py 位于根文件夹中,该文件夹还包括 DjangoProject 文件夹。

当我添加错误 attempted relative import beyond top-level packageDjangoProject/tests.py 我的单元测试很明显它来自进口。使用 try/except 我可以写出更清晰的错误,所以我不需要猜测导致错误的原因和文件。

现在我的代码如下所示:

try:
    from django.utils.safestring import mark_safe
    import json
    from django.conf import settings
    from viewsfunctions import *
    from .. import PoM
    import unittest
except Exception as importex:
    print("Error in the tests.py-imports: "+str(importex))

它首先抛出了所有信息:

"No module named 'viewsfunctions'"

这很有意义并且很有帮助,因为viewsfunctionsDjangoProject 中的一个模块。我将这一行替换为:from DjangoProject.viewsfunctions import *

下一个错误是:

Error in the Imports: attempted relative import beyond top-level package

这正是我的问题。这可能是任何东西。通过 pdbing,我可以将其追踪到 from .. import PoM(因为模块 PoM 相对于顶层文件夹中的 tests.py,但相对于同一文件夹中正在执行的 unittests.py

在这种只有少量导入的情况下,缩小范围相对较快,但有没有办法编写更好的异常消息或以某种方式传递更多信息,错误实际发生在哪些导入行中?

【问题讨论】:

  • 你使用什么命令行来运行测试?

标签: python exception python-import python-3.7 relative-import


【解决方案1】:

如果你只是捕获异常,你会得到一个非常有用的回溯:

>>> from .. import foo
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Users/deceze/...", line 21, in do_import
    module = self._system_import(name, *args, **kwargs)
ImportError: attempted relative import with no known parent package

问题是您正在捕获异常并且只打印尽可能少的错误消息。如果您出于某种原因确实想捕获异常但仍然收到完整的错误消息,最简单的方法是使用logging module

import logging

try:
    ...
except:
    logging.exception('Error fooing the bar')

这将生成您的自定义错误消息后跟完整的堆栈跟踪

要获得更多手动信息,请使用traceback module

import traceback

try:
    ...
except:
    print('Error fooing the bar')
    traceback.print_exc()

使用traceback 中的其他功能,您可以获得更精细的信息,并根据需要从异常中打印或检索消息。

【讨论】:

  • 如果我没有捕捉到异常,我会得到一个非常模糊的*** ValueError: attempted relative import beyond top-level package,根本没有任何信息
  • python3.7 unittests.py ,从它所在的地方执行(顶级)
  • 并且错误是直接发生在unittest.py 中,还是发生在它发现并从其他地方导入的测试之一中?如果您只将“from .. import foo”作为唯一内容放入 .py 文件并直接运行会怎样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2018-06-30
  • 2020-11-03
  • 2017-02-22
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多