更新:正如我所说,这不是与Python相关的原则性问题,但似乎更为具体。请看下面对我的问题的更多解释。在
我有一个自定义异常(我们称之为CustomException
),它位于一个名为exceptions.py
的文件中。现在想象一下,我可以通过两个路径导入该文件:
import application.exceptions
或者
^{pr2}$同样的结果。此外,我无法控制在其他模块中导入模块的方式。在
现在展示我的问题:假设函数do_something
来自另一个导入的模块异常.py在某种程度上我不知道。如果我这样做:
import application.exceptions
try:
do_something ()
except application.exceptions.CustomException:
catch_me ()
它可能起作用或不起作用,这取决于子模块如何导入exceptions.py
(我不知道)。在
问题:是否有一种方法可以避免这个问题,也就是说,不管包含路径如何,异常的名称都会被理解?如果没有,那么什么是避免这些名称冲突的最佳实践?在
干杯
这是一个Django应用程序。some
将是Django“项目”的名称,application
一个Django应用程序的名称。带有try..except子句的代码位于另一个应用程序frontend
,并作为文件some/frontend/views.py
中的视图存在于那里。在
PYTHONPATH是干净的,也就是说,在我的项目中,/path/to/project
在路径中。在frontend/views.py
中,我导入异常.py通过import application.exceptions
,这似乎是有效的。(现在,回顾过去,我不清楚,为什么会起作用…)
异常在exceptions.py
文件本身中引发。在
对一些读者来说,这可能是有趣的,我终于找到了进口出错的地方。在
sys.path
没有显示任何可疑的异常情况。我的Django项目位于/var/www/django/project
。我已经安装了app1
和app2
,但是在设置.py作为
INSTALLED_APPS = [
'project.app1',
'project.app2',
]
额外的project.
是搞乱sys.modules
的罪魁祸首。正在将设置重写为
INSTALLED_APPS = [
'app1',
'app2',
]
解决了问题。在
即使同一个模块以不同的方式多次导入,CustomException类仍然是同一个对象,因此如何引用它并不重要。在
“如果没有,有什么最佳做法可以避免这些名称冲突?”在
这完全取决于它们发生的原因。在正常安装中,不能同时从这两者导入应用程序.例外以及somepath.application.exceptions,除非第一种情况是来自模块somepath的相对路径。在这种情况下,Python将理解模块是相同的,您不会有问题。在
你不清楚你是真的有问题还是理论问题。如果你真的有问题,我猜你的Python有点可疑。可能一个目录和它的子目录都在路径中?在
为什么会有问题?异常将根据类类型进行匹配,并且无论它是如何导入的,它都是相同的
两者都捕捉到相同的异常
你甚至可以给它指定一个新的名字,尽管通常不推荐
^{pr2}$相关问题 更多 >
编程相关推荐