首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >定位“最高级别包之外的尝试相对导入”的最佳实践

定位“最高级别包之外的尝试相对导入”的最佳实践
EN

Stack Overflow用户
提问于 2019-12-11 10:13:45
回答 1查看 507关注 0票数 0

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

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

当我得到错误attempted relative import beyond top-level package的时候,我把DjangoProject/tests.py添加到了我的单元测试中,很明显,它来自进口。尝试/除了我能够写一个稍微更清楚的错误,所以我不需要猜测为什么和哪个文件导致错误。

现在我的代码如下所示:

代码语言:javascript
运行
复制
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))

它首先传达了这样的信息:

代码语言:javascript
运行
复制
"No module named 'viewsfunctions'"

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

下一个错误是:

代码语言:javascript
运行
复制
Error in the Imports: attempted relative import beyond top-level package

这正是我的问题。这可能是任何东西。只需简单地查看一下,我就可以追踪到from .. import PoM (因为模块PoM相对于顶部文件夹中的tests.py,但相对于同一文件夹中的执行unittests.py )。

在这种情况下,只需要几个导入,就可以比较快地缩小它的范围,但是是否有任何方法可以编写更好的异常消息或以某种方式传递更多的信息,在哪些导入行中实际发生了错误?

EN

回答 1

Stack Overflow用户

发布于 2019-12-11 10:26:58

如果您不能捕捉到异常,您将得到一个非常有用的跟踪:

代码语言:javascript
运行
复制
>>> 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

代码语言:javascript
运行
复制
import logging

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

这将产生您的自定义错误消息,然后是一个完整的堆栈跟踪。

要获得更多的手册,请使用traceback module

代码语言:javascript
运行
复制
import traceback

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

使用traceback中的其他函数,您可以获得更多的粒度,并根据需要从异常打印或检索消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59283397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档