0

我有以下代码来自 wesley chun 的核心 python 应用程序编程书

#!/usr/bin/env python
"""
tcp server
"""

from socket import AF_INET, SOCK_STREAM, socket
from time import ctime

HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)

tcp_server_socket = socket(AF_INET, SOCK_STREAM)
tcp_server_socket.bind(ADDR)
#maximum number of incoming connection before connection is refused
tcp_server_socket.listen(5)

while True:
    print "waiting for connection"
    tcpCliSock, addr = tcp_server_socket.accept()
    print "... connected from:" , addr

    while True:
        DATA = tcpCliSock.recv(BUFSIZE)
        if not DATA:
            break
        tcpCliSock.send('[%s] %s' % (ctime(), DATA))

    tcpCliSock.close()
tcp_server_socket.close()

我对原始代码进行了一些修改,但是我仍然很困惑如何最好地修改它以使其更合规

这是我收到的所有消息

C: 14,0: Invalid name "tcp_server_socket" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C: 21,4: Invalid name "tcpCliSock" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C: 21,16: Invalid name "addr" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
E: 25,15: Instance of '_socketobject' has no 'recv' member
E: 28,8: Instance of '_socketobject' has no 'send' member

我想前三个只是想让我使用所有大写变量名称,这是这些类型脚本的标准做法,我没有看到使用这种约定使代码变得更具可读性,相反它看起来不那么可读,什么是 pylint 中这种规则背后的动机以及如何使代码更兼容,我几乎不认为这种地位的作者会无缘无故地编写这样的代码,无论是可读性、初学者友好性还是其他任何东西。

4

1 回答 1

3

_socketobject您看到的两个错误是socket模块工作方式的一个怪癖。这个问题曾经在 StackOverflow 上出现过,链接的问题提供了几个答案来帮助您摆脱这些错误。

您收到的前三条消息是约定警告。他们抱怨名称tcp_server_socket和常量成员的正tcpCliSockaddr表达式不匹配。因为您的代码处于“顶级”(即在任何函数或类之外),所以成员应该是常量,并且常量的名称应该与给定的正则表达式匹配。

假设您的 Python 脚本保存在一个文件中tcp_server.py。如果您随后import tcp_server从 Python 解释器或另一个 Python 脚本编写,您的 TCP 服务器将启动。这通常不是您想要发生的。如果你import是一个模块,它可以定义函数、类和常量,但它不应该运行任何代码。

我建议将所有代码从该行tcp_server_socket = socket(....)向下移动到一个单独的函数中(我们称之为它start_server),然后在脚本底部添加以下行:

if __name__ == "__main__":
    start_server()

如果您直接运行脚本,这两行将启动您的服务器,但如果您import tcp_server从其他地方运行则不会。

Once you've done that, the warnings about variable names will go, but you will get some further convention warnings. Two of them will complain about DATA and tcpCliSock not matching the naming convention for variable names, and the other will nag you that your start_server function doesn't have a docstring.

于 2012-09-09T08:36:19.993 回答