以下代码的pylint合规性

时间:2012-09-09 03:32:17

标签: python pylint

我有以下来自wesley chun core python application programming book

的代码
#!/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背后的动机是什么以及如何使代码更加合规,我几乎不认为这种身材的作家会毫无理由地编写这样的代码,无论是可读性,初学友好性还是其他任何东西。

1 个答案:

答案 0 :(得分:3)

您看到的关于_socketobject的两个错误是socket模块如何工作的怪癖。此问题有come up on StackOverflow once before,相关问题提供了几个答案,可帮助您摆脱这些错误。

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

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

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

if __name__ == "__main__":
    start_server()

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

完成后,有关变量名称的警告将会出现,但您会收到一些常规警告。其中两个会抱怨DATAtcpCliSock与变量名称的命名约定不匹配,另一个会抱怨你的start_server函数没有文档字符串。