【发布时间】:2013-01-24 14:33:24
【问题描述】:
我正在尝试使我的 WSGI 服务器实现与 Python 2 和 Python 3 兼容。我有以下代码:
def start_response(status, response_headers, exc_info = None):
if exc_info:
try:
if headers_sent:
# Re-raise original exception if headers sent.
raise exc_info[0], exc_info[1], exc_info[2]
finally:
# Avoid dangling circular ref.
exc_info = None
elif headers_set:
raise AssertionError("Headers already set!")
headers_set[:] = [status, response_headers]
return write
...相关部分是:
# Re-raise original exception if headers sent.
raise exc_info[0], exc_info[1], exc_info[2]
Python 3 不再支持该语法,因此必须将其翻译为:
raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
问题:Python 2 语法在 Python 3 中生成解析错误。如何编写可以被 Python 2 和 Python 3 解析的代码?我已经尝试了以下方法,但这不起作用:
if sys.version_info[0] >= 3:
raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
else:
eval("raise exc_info[0], exc_info[1], exc_info[2]; 1", None, { 'exc_info': exc_info })
【问题讨论】:
-
这对我来说没有多大意义.. 你能把你的
start_response函数放在一些上下文中吗,也许展示一个你会调用它的例子? -
经典的
try/except有什么问题? -
@poke 和 @inbar rose:
start_response是 WSGI 规范的一部分。见 PEP-333。 WSGI 应用程序在想要开始响应时调用 start_response。如果给出了exc_info,那么这是 WSGI 应用程序代码遇到异常的信号,WSGI 服务器应该对它做一些事情,比如打印一个错误。就我而言,如果标头已经发出,我想提出错误。见python.org/dev/peps/pep-0333/#the-start-response-callable -
快速澄清一下,您说 Python 3 语法在 python 2 中产生了一个解析错误——在我看来,它应该是相反的。 python 2 语法在 python 3 中生成解析错误...
标签: python python-3.x python-2.x