Python - 在套接字操作中最终是必要的块吗?

时间:2015-04-15 06:53:09

标签: python sockets

我是Python的新手,目前正在进行一些套接字开发。我不太确定Python套接字编程的最佳实践。

例如,在以下代码中,conn=None行和finally块是否必要?这种操作的最佳惯例是什么?

@post('/relay/')
def relay():
    conn = None  # Do I need this line to ensure conn not to be undefined?
    try:
        conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        conn.connect(host_port)
        conn.sendall(content)
    except socket.error, se:
        if se.errno == 61:
            logger.error(...)
        else:
            logger.error(...)
        abort(400, 'Error...')
    finally:   # Should this socket.close() task be in finally block? like Java?
        if conn:
            conn.shutdown(socket.SHUT_RDWR)
            conn.close()
    return ''

1 个答案:

答案 0 :(得分:3)

finally通常在您使用某种类型的连接(套接字,数据库等)时使用,该连接已打开,在try中进行操作,无论发生什么情况< / em>,应在之后关闭。

是的,conn.close()应该放在finally区块中。

至于conn=None,这可能是必需的,但在你的情况下却不是。因为如果

conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

失败,conn永远不会被定义,它会跳转到finally块(因为失败)。但是,您检查if conn=None,以便它不会抱怨尝试关闭未定义的连接,因为跳过了if