更新:据我所知,这不是Python相关的主要问题,但似乎更具体。有关我的问题的更多解释,请参阅下文。
我有一个自定义异常(我们称之为CustomException
),它位于名为exceptions.py
的文件中。现在想象一下,我可以通过两条路径导入这个文件:
import application.exceptions
或
import some.application.exceptions
具有相同的结果。此外,我无法控制模块在其他模块中的导入方式。
现在展示我的问题:假设函数do_something
来自另一个以我不知道的方式导入exceptions.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
我通过import application.exceptions
导入exceptions.py,这似乎有效。 (现在,在回顾展中,我不确切地知道,为什么它有效......)
exceptions.py
文件本身引发了异常。
有些读者可能会感兴趣,我终于找到了进口出错的地方。
sys.path
没有显示任何可疑的违规行为。我的Django项目位于/var/www/django/project
。我安装了应用app1
和app2
,但在settings.py中注明了
INSTALLED_APPS = [
'project.app1',
'project.app2',
]
额外的 project.
是弄乱sys.modules
的罪魁祸首。将设置重写为
INSTALLED_APPS = [
'app1',
'app2',
]
解决了这个问题。
答案 0 :(得分:1)
为什么会出现问题?我将根据类类型进行匹配,但它会相同,但它会导入,例如。
import exceptions
l=[]
try:
l[1]
except exceptions.IndexError,e:
print e
try:
l[1]
except IndexError,e:
print e
都捕获相同的异常
您甚至可以将其分配给新名称,但通常不建议
import os
os.myerror = exceptions.IndexError
try:
l[1]
except os.myerror,e:
print e
答案 1 :(得分:1)
“如果没有,那么避免这些名称冲突的最佳做法是什么?”
这完全取决于他们为什么会这样。在正常安装中,您无法从application.exceptions和somepath.application.exceptions导入,除非第一种情况是模块somepath中的相对路径。在这种情况下,Python会理解模块是相同的,你也不会有问题。
你不清楚你是否真的有问题或是否有理论。如果你确实遇到了问题,我猜你的PYTHONPATH有些可疑。也许目录和它的子目录都在PATH中?
答案 2 :(得分:0)
即使同一个模块以不同方式导入多次,CustomException类仍然是同一个对象,因此引用它并不重要。
答案 3 :(得分:0)
我不知道是否有办法处理这个包含路径问题。 我的建议是在导入中使用'as'关键字
类似的东西:
import some.application.exceptions as my_exceptions
或
import application.exceptions as my_exceptions